Wie kann ich effizient Dateien lesen und schreiben, die zu groß sind, um in den Arbeitsspeicher zu passen?

ch versuche, die Kosinusähnlichkeit von 100.000 Vektoren zu berechnen, und jeder dieser Vektoren hat 200.000 Dimensione

Aus dem Lesen anderer Fragen weiß ich, dass memmap, PyTables und h5py sind meine besten Tipps für den Umgang mit dieser Art von Daten, und ich arbeite derzeit mit zwei Memmaps. eine zum Lesen der Vektoren, die andere zum Speichern der Cosinus-Ähnlichkeitsmatri

Hier ist mein Code:

import numpy as np
import scipy.spatial.distance as dist

xdim = 200000
ydim = 100000

wmat = np.memmap('inputfile', dtype = 'd', mode = 'r', shape = (xdim,ydim))
dmat = np.memmap('outputfile', dtype = 'd', mode = 'readwrite', shape = (ydim,ydim))

for i in np.arange(ydim)):
    for j in np.arange(i+1,ydim):
        dmat[i,j] = dist.cosine(wmat[:,i],wmat[:,j])
        dmat.flush()

erzeit meldet htop, dass ich 224 G VIRT-Speicher und 91,2 G RES-Speicher verwende, der stetig ansteigt. Mir kommt es so vor, als würde am Ende des Prozesses die gesamte Ausgabematrix im Speicher gespeichert, was ich vermeiden möchte.

FRAGE: Ist dies eine korrekte Verwendung von Memmaps? Schreibe ich auf speichereffiziente Weise in die Ausgabedatei (womit ich meine, dass nur die notwendigen Teile der Ein- und Ausgabedateien, d.dmat[i,j] undwmat[:,i/j], sind im Speicher gespeichert)?

Wenn nicht, was habe ich falsch gemacht und wie kann ich das beheben?

Vielen Dank für jeden Rat, den Sie haben können!

EDIT: Ich habe gerade festgestellt, dass htop eine Gesamtspeicherauslastung des Systems von 12 G meldet. Es scheint also doch, dass es funktioniert. Wer kann mich da draußen aufklären? RES ist jetzt bei 111G ...

EDIT2: Die Memmap wird aus einem 1D-Array erstellt, das aus sehr vielen langen Dezimalstellen in der Nähe von 0 besteht und auf die gewünschten Abmessungen geformt ist. Die Memmap sieht dann so aus.

memmap([[  9.83721223e-03,   4.42584107e-02,   9.85033578e-03, ...,
     -2.30691545e-07,  -1.65070799e-07,   5.99395837e-08],
   [  2.96711345e-04,  -3.84307391e-04,   4.92968462e-07, ...,
     -3.41317722e-08,   1.27959347e-09,   4.46846438e-08],
   [  1.64766260e-03,  -1.47337747e-05,   7.43660202e-07, ...,
      7.50395136e-08,  -2.51943163e-09,   1.25393555e-07],
   ..., 
   [ -1.88709000e-04,  -4.29454722e-06,   2.39720287e-08, ...,
     -1.53058717e-08,   4.48678211e-03,   2.48127260e-07],
   [ -3.34207882e-04,  -4.60275148e-05,   3.36992876e-07, ...,
     -2.30274532e-07,   2.51437794e-09,   1.25837564e-01],
   [  9.24923862e-04,  -1.59552854e-03,   2.68354822e-07, ...,
     -1.08862665e-05,   1.71283316e-07,   5.66851420e-01]])

Antworten auf die Frage(4)

Ihre Antwort auf die Frage