GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So beschleunigen Sie eine Suche in einer großen Sammlung von Textdateien (1 TB)

Es gibt bereits viele Antworten, ich wollte nur meinen Senf hinzufügen:

  1. So viele riesige Daten (1 TB) mit nur 8 GB Arbeitsspeicher zu haben, wird für keinen Ansatz gut genug sein, sei es die Verwendung von Lucene oder Elasticsearch (intern verwendet Lucene) oder einen grep-Befehl, wenn Sie eine schnellere Suche wünschen, die Der Grund ist sehr einfach, dass alle diese Systeme die Daten im schnellsten Speicher halten, um sie schneller bedienen zu können, und von 8 GB (25 % sollten Sie für das Betriebssystem und weitere 25-50 % mindestens für andere Anwendungen reservieren) bleiben Ihnen sehr viele übrig wenige GB RAM.
  2. Das Aufrüsten der SSD, das Erhöhen des Arbeitsspeichers auf Ihrem System wird helfen, aber es ist ziemlich umständlich, und wenn Sie wieder auf Leistungsprobleme stoßen, wird es schwierig sein, Ihr System vertikal zu skalieren.

Vorschlag

  1. Ich weiß, dass Sie bereits erwähnt haben, dass Sie dies auf Ihrem System tun möchten, aber wie gesagt, es würde keinen wirklichen Nutzen bringen und Sie könnten am Ende so viel Zeit verschwenden (Infra- und Code-weise (so viele Ansätze wie erwähnt in verschiedenen Antworten)), würde daher vorschlagen, dass Sie den Top-Down-Ansatz anwenden, wie in meiner anderen Antwort erwähnt, um die richtige Kapazität zu bestimmen. Es würde Ihnen helfen, schnell die richtige Kapazität für den von Ihnen gewählten Ansatz zu ermitteln.
  2. In Bezug auf die Implementierung würde ich vorschlagen, dies mit Elasticsearch (ES) zu tun, da es sehr einfach einzurichten und zu skalieren ist. Sie können sogar AWS Elasticsearch verwenden, das auch in der kostenlosen Version verfügbar ist und später schnell skaliert werden kann, obwohl ich bin kein großer Fan von AWS ES, das spart viel Zeit bei der Einrichtung und Sie können schnell loslegen, wenn Sie mit ES vertraut sind.

  3. Um die Suche zu beschleunigen, können Sie die Datei in mehrere Felder aufteilen (Titel, Hauptteil, Tags, Autor usw.) und nur das wichtige Feld indizieren, was die Größe des invertierten Index verringern würde, und wenn Sie nur nach exakter Zeichenfolgenübereinstimmung suchen ( keine Teil- oder Volltextsuche), dann können Sie einfach den keyword verwenden Feld, das noch schneller indexiert und durchsucht werden kann.

  4. Ich kann weiter darüber sprechen, warum Elasticsearch gut ist und wie es optimiert werden kann, aber das ist nicht der springende Punkt, und das Fazit ist, dass jede Suche eine erhebliche Menge an Arbeitsspeicher, CPU und Festplatte benötigt und zu einem Engpass wird würde Ihre lokale Systemsuche und andere Anwendungen behindern, daher raten wir Ihnen, dies wirklich auf einem externen System zu tun, und Elasticsearch sticht wirklich als Mittel für verteilte Systeme und heute als beliebtestes Open-Source-Suchsystem hervor.

Sie brauchen eindeutig einen Index, wie fast jede Antwort vorgeschlagen hat. Sie könnten Ihre Hardware vollständig verbessern, aber da Sie gesagt haben, dass sie behoben ist, werde ich darauf nicht näher eingehen.

Ich habe ein paar relevante Hinweise für Sie:

  1. Indizieren Sie nur die Felder, in denen Sie den Suchbegriff finden möchten, anstatt den gesamten Datensatz zu indizieren;
  2. Erstellen Sie einen mehrstufigen Index (d. h. Index über Index), damit Ihre Indexsuchen schneller sind. Dies ist besonders relevant, wenn Ihr Index auf mehr als 8 GB anwächst;
  3. Als Alternative wollte ich Ihnen das Caching Ihrer Suchen empfehlen, aber das führt dazu, dass eine neue Suche wieder einen halben Tag dauert. Daher ist es eindeutig besser, Ihre Daten vorzuverarbeiten, um einen Index zu erstellen, als die Daten zu verarbeiten, wenn die Abfrage kommt.

Kleines Update:

Viele Antworten hier schlagen vor, die Daten in die Cloud zu stellen. Ich würde dringend empfehlen, selbst für anonymisierte medizinische Daten, dass Sie sich bei der Quelle bestätigen lassen (es sei denn, Sie haben die Daten aus dem Internet gekratzt), dass dies in Ordnung ist.


Um Ihre Suche zu beschleunigen, benötigen Sie einen invertierten Index. Um neue Dokumente hinzufügen zu können, ohne alle vorhandenen Dateien neu indizieren zu müssen, sollte der Index inkrementell sein.

Eines der ersten Open-Source-Projekte, das die inkrementelle Indizierung eingeführt hat, ist Apache Lucense. Es ist immer noch die am weitesten verbreitete Indizierungs- und Suchmaschine, obwohl andere Tools, die seine Funktionalität erweitern, heutzutage beliebter sind. Elasiticsearch und Solr basieren beide auf Lucense. Aber solange Sie kein Web-Frontend, Unterstützung für analytisches Abfragen, Filtern, Gruppieren, Unterstützung für das Indizieren von Nicht-Text-Dateien oder eine Infrastruktur für einen Cluster-Aufbau über mehrere Hosts benötigen, ist Lucene immer noch die beste Wahl.

Apache Lucense ist eine Java-Bibliothek, wird jedoch mit einer voll funktionsfähigen, befehlszeilenbasierten Demoanwendung geliefert. Diese einfache Demo sollte bereits alle Funktionen bieten, die Sie benötigen.

Mit etwas Java-Kenntnissen wäre es auch einfach, die Anwendung an Ihre Bedürfnisse anzupassen. Sie werden überrascht sein, wie einfach der Quellcode der Demo-Anwendung ist. Wenn Java nicht die Sprache Ihrer Wahl sein sollte, kann der Wrapper für Pyhton, PyLucene auch eine Alternative sein. Die Indizierung der Demoanwendung ist bereits fast auf das Minimum reduziert. Standardmäßig werden keine erweiterten Funktionen wie Stemming oder Optimierung für komplexe Abfragen verwendet - Funktionen, die Sie höchstwahrscheinlich für Ihren Anwendungsfall nicht benötigen, die jedoch die Größe des Index und die Indizierungszeit erhöhen würden.


Linux
  1. So verwenden Sie den Grep-Befehl, um Text in Dateien zu finden

  2. So verbinden Sie zwei Textdateien unter Linux

  3. So suchen Sie in der Konsole nach großen Dateien

  4. Wie finde ich Dateien auf Ubuntu?

  5. Schnelle Textsuche in über 600.000 Dateien

Bash-Scripting:So schreiben Sie Daten in Textdateien

So verschieben Sie eine große Anzahl von Dateien in Linux

So kopieren Sie eine große Anzahl von Dateien unter Linux

So finden Sie Dateien, die eine bestimmte Textzeichenfolge in Linux enthalten

So können Sie große (100 GB+) Dateien unter Linux schneller komprimieren

So verwenden Sie den More-Befehl in Linux, um große Textdateien zu lesen