Ich bin in der Mitte eines Java-Projekts, das ein 'großes Wörterbuch' von Wörtern verwenden wird. Mit 'Wörterbuch' meine ich bestimmte Zahlen (int), die Strings zugewiesen sind. Und mit "groß" meine ich eine Datei in der Größenordnung von 100 MB. Die erste Lösung, die ich gefunden habe, ist wahrscheinlich die einfachste. Bei der Initialisierung lese ich die ganze Datei ein und erstelle eine große HashMap, die später verwendet wird, um Strings zu suchen.'Big Dictionary' Implementierung in Java
Gibt es eine effiziente Möglichkeit, dies zu tun, ohne dass die gesamte Datei bei der Initialisierung gelesen werden muss? Vielleicht nicht, aber was ist, wenn die Datei wirklich groß ist, sagen wir in der Reihenfolge des verfügbaren Arbeitsspeichers? Im Grunde suche ich nach einer Möglichkeit, die Dinge effizient in einem großen Wörterbuch zu suchen.
Danke für die Antworten bis jetzt, als Ergebnis habe ich realisiert, dass ich spezifischer in meiner Frage sein könnte. Wie Sie wahrscheinlich schon vermutet haben, hat die Anwendung mit Text Mining zu tun, insbesondere mit der Darstellung von Text in Form eines spärlichen Vektors (obwohl einige andere erfinderische Ideen hatten :)). Was für die Verwendung entscheidend ist, ist, in der Lage zu sein, Zeichenfolgen im Wörterbuch nachzuschlagen und ihre Schlüssel so schnell wie möglich zu erhalten. Der anfängliche Aufwand, die Wörterbuchdatei zu "lesen" oder in eine Datenbank zu indizieren, ist nicht so wichtig, solange die Nachschlagezeit optimiert ist. Nehmen wir an, dass die Wörterbuchgröße groß ist, vergleichbar mit der Größe des verfügbaren RAM.
Sie können die Datei in bestimmten Byte-Größe lesen, speichern Sie es in einem HashMap-Objekt, und speichern Sie dann dieses Objekt als ein Bytestream-Objekt auf Ihrer Festplatte. Wiederholen Sie dies, bis Sie die gesamte Datei gelesen haben. –
@Mohammad Das löst nicht wirklich den Anwendungsfall, bei dem die Eingabeobjekte größer sind als der verfügbare Speicher.Am Ende des Tages wirst du mit einer HashMap enden, die zu viele Objekte enthält. – Santa
[Memory-Mapped-Dateien] (https://en.wikipedia.org/wiki/Memory-maped_file) kann hilfreich sein. Werfen Sie einen Blick auf [FileChannel.map()] (http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#map%28java.nio.channels.FileChannel. MapMode,% 20long,% 20long% 29) und Sie können einen 'FileChannel' von einer' RandomAccessFile' erhalten. –