Ich habe Probleme, ein Perl-Programm nach Java zu portieren und Java zu lernen, so wie ich es mache. Eine zentrale Komponente des ursprünglichen Programms ist eine , die String-Präfix-Lookups in einer +500 GB sortierten Textdatei unter Verwendung der binären Suche (im Wesentlichen "suchen" zu einem Byte Offset in der Mitte der Datei, zurück zum nächsten Newline, vergleichen) Zeile Präfix mit der Suchzeichenkette, "suchen", um den Byteversatz zu halbieren/zu verdoppeln, wiederholen, bis gefunden ...)Binäre Suche in einer sortierten (Memory-Mapped?) Datei in Java
Ich habe mit mehreren Datenbanklösungen experimentiert, aber gefunden, dass nichts dieses in bloßer Nachschlagegeschwindigkeit mit Datensätzen schlägt diese Größe. Kennen Sie eine vorhandene Java-Bibliothek, die diese Funktionalität implementiert? Könnten Sie mich auf einen idiomatischen Beispielcode hinweisen, der zufällige Lesezugriffe in Textdateien vornimmt?
Alternativ kenne ich die neuen (?) Java I/O-Bibliotheken nicht, aber wäre es eine Option, die 500-GB-Textdatei zu speichern (ich bin auf einer 64-Bit-Maschine mit Speicher)) und binäre Suche auf dem Speicher-gemappten Byte-Array durchführen? Ich würde mich sehr freuen, irgendwelche Erfahrungen zu hören, die Sie über diese und ähnliche Probleme teilen müssen.
Ich kann nicht glauben, dass die NIO-Puffer einen int als Offset verwenden, der die Möglichkeit ausschließt um es mit mehr als 2 GB zu verwenden. Das ist fast dumm auf den heutigen Maschinen. In diesem Kontext, so schnell wie es ist, schließt dies den Ansatz in dem hier angegebenen Kontext aus. – dmeister
Beachten Sie, dass die FileChannel.map() - Funktion eine lange dauert, aber ByteBuffer selbst nimmt nur Ints. Sie können Dateien verwenden, die viel größer als 2 GB sind, nur dass eine bestimmte zugeordnete Ansicht selbst nur 2 GB groß sein kann. (für die Aufzeichnung der Win32 OS hat die gleiche Einschränkung) –
Guter Punkt, Jason S. –