Poiché non si conoscono i meccanismi interni di pickle, è necessario utilizzare un altro metodo di memorizzazione. Lo script seguente utilizza le funzioni tobytes()
per salvare i dati in linea in un file raw.
Poiché la lunghezza di ogni riga è nota, il suo offset nel file può essere calcolato e accessibile tramite seek()
e read()
. Successivamente, viene riconvertito in una matrice con la funzione frombuffer()
.
Il grande disclaimer tuttavia è che la dimensione dell'array non è stata salvata (potrebbe essere aggiunta anche se richiede alcune ulteriori complicazioni) e che questo metodo potrebbe non essere portatile come un array decapato.
Come sottolineato da @PadraicCunningham nel suo comment, un memmap è probabilmente una soluzione alternativa ed elegante.
Note sulle prestazioni: Dopo aver letto i commenti ho fatto un breve punto di riferimento. Sulla mia macchina (16 GB di RAM, SSD crittografato) sono stato in grado di eseguire 40000 letture di righe casuali in 24 secondi (con una matrice 20000x40000 ovviamente, non il 10x10 dell'esempio).
from __future__ import print_function
import numpy
import random
def dumparray(a, path):
lines, _ = a.shape
with open(path, 'wb') as fd:
for i in range(lines):
fd.write(a[i,...].tobytes())
class RandomLineAccess(object):
def __init__(self, path, cols, dtype):
self.dtype = dtype
self.fd = open(path, 'rb')
self.line_length = cols*dtype.itemsize
def read_line(self, line):
offset = line*self.line_length
self.fd.seek(offset)
data = self.fd.read(self.line_length)
return numpy.frombuffer(data, self.dtype)
def close(self):
self.fd.close()
def main():
lines = 10
cols = 10
path = '/tmp/array'
a = numpy.zeros((lines, cols))
dtype = a.dtype
for i in range(lines):
# add some data to distinguish lines
numpy.ndarray.fill(a[i,...], i)
dumparray(a, path)
rla = RandomLineAccess(path, cols, dtype)
line_indices = list(range(lines))
for _ in range(20):
line_index = random.choice(line_indices)
print(line_index, rla.read_line(line_index))
if __name__ == '__main__':
main()
fonte
2016-06-21 21:16:27
Memorizzarlo in un altro formato che consente l'accesso casuale o incrementale. – martineau
Che cosa mi consiglia? Posso convertirlo da pickle in un altro formato senza doverlo aprire? – StatsSorceress
Dovrai caricarlo e scaricarlo di nuovo in un altro formato –