Schneller großer Datenimport als Get ["raggedmatrix.mx"]?

9

Kann jemand eine Alternative empfehlen, ein paar zu importieren? GByte numerischer Daten (in .mx-Form) aus einer Liste von 60 .mx-Dateien, jede etwa 650 MByte?

Das - hier zu große - Forschungsproblem beinhaltete einfache statistische Operationen mit doppelt so viel GB Daten (etwa 34) als RAM verfügbar (16). Um das Problem mit der Datengröße zu lösen, habe ich die Dinge aufgeteilt und benutzt eine Get / Clear-Strategie zum Rechnen.

Es funktioniert, aber der Aufruf von Get["bigfile.mx"] dauert ziemlich lange, also habe ich mich gefragt, ob es schneller ist, BLOBs oder was auch immer mit PostgreSQL oder MySQL zu verwenden oder welche Datenbank für GB von numerischen Daten verwendet wird.

Also meine Frage ist wirklich: Was ist die effizienteste Methode, um wirklich umfangreiche Datenimportvorgänge in Mathematica durchzuführen?

Ich habe es noch nicht versucht, aber ich denke, dass SQLImport von DataBaseLink langsamer als Get["bigfile.mx"] ist.

Jeder hat etwas Erfahrung zu teilen?

(Tut mir leid, wenn das keine sehr spezielle Programmierfrage ist, aber es würde mir wirklich helfen, mit dem zeitraubenden Herausfinden der besten Möglichkeiten der 137-Möglichkeiten fortzufahren -Angriff-in-Mathematica).

    
Rolf Mertig 20.12.2011, 22:28
quelle

2 Antworten

3

Hier ist eine Idee:

Sie sagten, Sie hätten eine zerlumpte Matrix, d. h. eine Liste von Listen unterschiedlicher Länge. Ich nehme Gleitkommazahlen an.

Sie könnten die Matrix reduzieren, um ein einzelnes langes gepacktes 1D-Array zu erhalten (verwenden Sie Developer'ToPackedArray , um es bei Bedarf zu packen), und speichern Sie die Anfangsindizes der Unterlisten separat. Dann rekonstruieren Sie die zerlumpte Matrix, nachdem die Daten importiert wurden.

Hier ist eine Demonstration, dass innerhalb von Mathematica (d. h. nach dem Import) das Extrahieren der Unterlisten aus einer großen, abgeflachten Liste schnell ist.

%Vor%

Speichern Sie alternativ eine Folge von Sublistelängen und verwenden Sie Mr.Wizards dynamicPartition -Funktion , die genau das tut. Mein Punkt ist, dass das Speichern der Daten in einem flachen Format und das Partitionieren im Kernel zu einem vernachlässigbaren Mehraufwand führt.

Das Importieren gepackter Arrays als MX-Dateien ist sehr schnell. Ich habe nur 2 GB Speicher, so dass ich nicht auf sehr großen Dateien testen kann, aber die Importzeiten sind immer einen Bruchteil einer Sekunde für gepackte Arrays auf meinem Rechner. Dies wird das Problem lösen, dass das Importieren von Daten, die nicht gepackt sind, langsamer sein kann (obwohl ich, wie ich in den Kommentaren zur Hauptfrage gesagt habe, die Art der extremen Langsamkeit, die du erwähnst, nicht reproduzieren kann).

Wenn BinaryReadList schnell ist (es ist nicht so schnell wie MX-Dateien jetzt lesen, aber es sieht wie aus wird in Mathematica 9 erheblich beschleunigt ), Sie könnten den gesamten Datensatz als eine große Binärdatei speichern, ohne sie in separate MX-Dateien aufteilen zu müssen. Dann könnten Sie relevante Teile der Datei wie folgt importieren:

Erstellen Sie zuerst eine Testdatei:

%Vor%

Öffnen Sie es:

%Vor%

Überspringen Sie die ersten fünf Millionen Einträge:

%Vor%

Lesen Sie 5 Millionen Einträge:

%Vor%

Lesen Sie alle verbleibenden Einträge:

%Vor%

(Zum Vergleich liest Get normalerweise die gleichen Daten aus einer MX-Datei in weniger als 1,5 Sekunden. Ich bin auf WinXP btw.)

BEARBEITEN Wenn Sie bereit sind, Zeit damit zu verbringen und C-Code zu schreiben, ist eine andere Idee, eine Bibliotheksfunktion zu erstellen (mit Bibliothek Link ), die die Datei memory-map ( Link für Windows ) und kopieren Sie es direkt in ein MTensor -Objekt (ein MTensor ist nur ein gepacktes Mathematica-Array, wie von der C-Seite von Library Link aus gesehen).

    
Szabolcs 21.12.2011 10:27
quelle
1

Ich denke, die zwei besten Ansätze sind entweder:

1) Verwenden Sie Get auf der * .mx-Datei,

2) oder lese diese Daten ein und speichere sie in einem Binärformat, für das du einen LibraryLink-Code schreibst und lies dann das Zeug. Das hat natürlich den Nachteil, dass Sie Ihre MX-Sachen konvertieren müssen. Aber vielleicht ist das eine Option.

Im Allgemeinen geht es mit MX-Dateien ziemlich schnell.

Sind Sie sicher, dass dies kein Austauschproblem ist?

Bearbeiten 1 : Sie könnten dann auch in einen Importkonverter schreiben: tutorial / DevelopingAnImportConverter

    
user1054186 21.12.2011 08:45
quelle

Tags und Links