Frage

Ich habe eine 10 -GB -CSV -Datei, die im Wesentlichen eine riesige Quadratmatrix ist. Ich versuche eine Funktion zu schreiben, die so effizient wie möglich auf eine einzelne Zelle der Matrix zugreifen kann, dh Matrix [12345.20000].

Angesichts seiner Größe ist es offensichtlich nicht möglich, die gesamte Matrix in ein 2D -Array zu laden. Ich muss die Werte irgendwie direkt aus der Datei lesen.

Ich habe gegoogelt, wenn ich den Zufallszugriff von Dateien mit fileStream.seek betrachte, aber leider ist es leider keine feste Breite, die jede Zelle variable Rundung ist. Es wäre mir nicht möglich, ein bestimmtes Byte zu suchen und zu wissen, welche Zelle ich von einer Art Arithmetik betrachte.

Ich habe überlegt, die Datei zu scannen und eine Nachschlagetabelle für den Index des ersten Byte jeder Zeile zu erstellen. Auf diese Weise würde ich, wenn ich auf Matrix [12345.20000] zugreifen wollte, bis zum Beginn von Zeile 12345 zugreifen und dann über die Linie scannen und die Kommas zählen, bis ich die richtige Zelle erreiche.

Ich werde das versuchen, aber hat noch jemand bessere Ideen bekommen? Ich bin sicher, ich wäre nicht die erste Person, die versucht, mit einer solchen Datei umzugehen.

Prost

Bearbeiten: Ich sollte beachten, dass die Datei eine sehr spärliche Matrix enthält. Wenn das Parsen der CSV -Datei zu langsam ist, würde ich in Betracht ziehen, die Datei in ein geeigneteres und leichter zu verarbeitenderes Dateiformat zu konvertieren. Was ist der beste Weg, um eine spärliche Matrix aufzubewahren?

War es hilfreich?

Lösung

Ich habe Lumenworks CSV -Leser für ziemlich große CSV -Dateien verwendet. Es kann sich möglicherweise schnell ansehen, wie schnell es Ihre Datei analysieren kann.

Lumenworks CSV

Andere Tipps

Wie möchten Sie sich zunächst auf eine bestimmte Zeile beziehen? Ist es der Index der Zeile, so dass Sie eine andere Tabelle haben oder etwas, das Ihnen hilft, zu wissen, welche Zeile Sie interessiert? Oder ist es durch eine ID oder so?

Diese Ideen kommen mir in den Sinn

  • Ihr Ansatz
  • Binäre Suche. Angenommen, Sie haben eine durchschnittliche Länge (Größe/Zeilen), können Sie eine binäre Suche verwenden, um eine Zeile zu finden, vorausgesetzt, es gibt eine Kennung in der Reihe, die bestellt wird, und können Sie sagen, ob Sie getroffen oder verpasst werden.
  • Laden Sie es in eine Datenbank! Was verhindert übrigens, dass Sie das tun? Sie können sogar SQL Express verwenden - was ist frei - und um das Größengrenze umzugehen, können Sie Scherbe Ihre Daten zu mehreren Datenbanken.

Index-File wäre das Beste, was Sie tun könnten. Ich wette. Mit einer unbekannten Größe der Zeile gibt es keine Möglichkeit, direkt in die Zeile zu überspringen, als die Datei entweder zu scannen oder einen Index zu haben.

Die einzige Frage ist, wie groß Ihr Index ist. Wenn es zu groß ist, können Sie es kleiner machen, indem Sie nur alle 5. (z. B.) Linie und Scan im Bereich von 5 Zeilen scannen.

Verarbeiten Sie die Datei so, dass die Felder fest sind. Dann können Sie Ihre zufällige Lektüre leicht tun.

Aus ähnlichen Arten von in der Vergangenheit sollten Sie in der Lage sein, einen einfachen Code zu schreiben, der die 10G -Datei mit variabler Breite von einer lokalen Festplatte liest, und in wenigen (~ 20) Minuten eine 10G -Datei mit fester Breite auf eine lokale Festplatte schreibt. Wenn sich diese Vorzeitinvestition auszahlt, hängt davon ab, wie viele zufällige Lesevorgänge Sie durchführen müssen und wie oft die Datei zu lesen ist.

Was ist, wenn Sie 12345 separate Datei erstellt haben, die mit fauler Instanziierung gelesen werden? Jede Datei würde nur gelesen, wenn die Daten benötigt würden. Wenn die Daten vollständig spärlich sind, können Sie eine Datenstruktur mit einer Isempty Bool -Eigenschaft erstellen.

Müssen Sie immer wieder auf dasselbe Element zugreifen oder müssen Sie einfach jedes Element einmal lesen?

Ich bin nicht einverstanden, dass Sie die Datei nicht in RAM laden sollten, insbesondere wenn Sie ein 64 -Bit -Betriebssystem verwenden.

Es sollte kein Problem sein, eine Matrix der Größe 12345x20000 zuzuordnen: Das ist nur etwa 1,9 GB in doppelter Genauigkeit. Und selbst wenn die Größe größer wäre, würde ich diesen Ansatz unter einer 64 -Bit -Plattform immer noch empfehlen (siehe "Virtual Memory").

Zweitens haben Sie angegeben, dass Ihre Matrix spärlich war, daher konnten Sie in RAM laden, aber eine spärliche Darstellung verwenden, um etwas Speicher zu ersparen.

Abschließend, wenn Ihre Anwendung viele Zugriff auf Ihre Matrix erfordert und die Leistung etwas wichtig ist, wäre es definitiv mein Lieblingsansatz.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top