Ich habe einige große (sogar um 10GB gezippte) Dateien, die einen ASCII-Header und dann im Prinzip numpy.recarrays von je ca. 3MB enthalten, nennen wir sie "Events". Mein erster Ansatz sah so aus:
%Vor%Dies ist jedoch nicht möglich, da np.fromfile ein echtes FILE-Objekt benötigt, da es wirklich Low-Level-Aufrufe (ein ziemlich altes Ticket Ссылка ).
So wie ich es verstehe, muss ich es so machen:
%Vor%Und ja, es funktioniert! Aber ist das nicht furchtbar ineffizient? Ist das Mem für s nicht zugeordnet und wird Müll für jedes Ereignis gesammelt? Auf meinem Laptop erreiche ich ungefähr 16 Ereignisse / s, d. H. ~ 50 MB / s
Ich frage mich, ob jemand einen klugen Weg kennt, das Mem einmal zuzuweisen und dann numpy direkt in dieses Mem lesen zu lassen.
Übrigens. Ich bin Physiker, also ... na ja, immer noch ein Neuling in diesem Geschäft.
@Bakuriu ist wahrscheinlich richtig, dass dies wahrscheinlich eine Mikro-Optimierung ist. Ihr Engpass ist fast definitiv IO, und danach Dekompression. Es ist wahrscheinlich nicht wichtig, den Speicher zweimal zuzuweisen.
Wenn Sie jedoch die zusätzliche Speicherzuweisung vermeiden möchten, können Sie numpy.frombuffer
verwenden, um die Zeichenfolge als numpy-Array anzuzeigen.
Dies vermeidet das Duplizieren von Speicher (die Zeichenfolge und das Array verwenden denselben Speicherpuffer), aber das Array ist standardmäßig schreibgeschützt. Sie können es dann ändern, um das Schreiben zu ermöglichen, wenn Sie möchten.
In Ihrem Fall wäre es so einfach, fromstring
durch frombuffer
zu ersetzen:
Nur um zu beweisen, dass Speicher mit diesem Ansatz nicht dupliziert wird:
%Vor% Dies ergibt: yello
anstelle von hello
.
Unabhängig davon, ob es sich in diesem speziellen Fall um eine signifikante Optimierung handelt oder nicht, es ist ein nützlicher Ansatz, den Sie beachten sollten.