Usar archivos de memmap para el procesamiento por lotes

Tengo un gran conjunto de datos en el que deseo PCA. Estoy limitado por la RAM y la eficiencia computacional de PCA. Por lo tanto, cambié a usar PCA iterativo.

Tamaño del conjunto de datos: (140000,3504)

losdocumentación Establece queThis algorithm has constant memory complexity, on the order of batch_size, enabling use of np.memmap files without loading the entire file into memory.

Esto es realmente bueno, pero no estoy seguro de cómo aprovechar esto.

Intenté cargar un memmap con la esperanza de que pudiera acceder a él en trozos, pero mi RAM explotó. Mi código a continuación termina usando mucha RAM:

ut = np.memmap('my_array.mmap', dtype=np.float16, mode='w+', shape=(140000,3504))
clf=IncrementalPCA(copy=False)
X_train=clf.fit_transform(ut)

Cuando digo "mi RAM explotó", el Traceback que veo es:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\Python27\lib\site-packages\sklearn\base.py", line 433, in fit_transfo
rm
    return self.fit(X, **fit_params).transform(X)
  File "C:\Python27\lib\site-packages\sklearn\decomposition\incremental_pca.py",
 line 171, in fit
    X = check_array(X, dtype=np.float)
  File "C:\Python27\lib\site-packages\sklearn\utils\validation.py", line 347, in
 check_array
    array = np.array(array, dtype=dtype, order=order, copy=copy)
MemoryError

¿Cómo puedo mejorar esto sin comprender la precisión reduciendo el tamaño del lote?

Mis ideas para diagnosticar:

Miré elsklearn código fuente y en elfit() funciónCódigo fuente Puedo ver lo siguiente. Esto tiene sentido para mí, pero todavía no estoy seguro de lo que está mal en mi caso.

for batch in gen_batches(n_samples, self.batch_size_):
        self.partial_fit(X[batch])
return self

Editar: En el peor de los casos, tendré que escribir mi propio código para el PCA iterativo que procesa por lotes leyendo y cerrando archivos .npy. Pero eso derrotaría el propósito de aprovechar el truco ya presente.

Edit2: Si de alguna manera pudiera eliminar un lote de procesadomemmap file. Tendría mucho sentido.

Edit3: Idealmente, si IncrementalPCA.fit () solo usa lotes, no debería bloquear mi RAM. Publicar todo el código, solo para asegurarme de que no estoy cometiendo un error al vaciar completamente el mapa de memoria en el disco antes.

temp_train_data=X_train[1000:]
temp_labels=y[1000:] 
out = np.empty((200001, 3504), np.int64)
for index,row in enumerate(temp_train_data):
    actual_index=index+1000
    data=X_train[actual_index-1000:actual_index+1].ravel()
    __,cd_i=pywt.dwt(data,'haar')
    out[index] = cd_i
out.flush()
pca_obj=IncrementalPCA()
clf = pca_obj.fit(out)

Sorprendentemente, notoout.flush no libera mi memoria ¿Hay alguna manera de usardel out para liberar mi memoria por completo y luego alguien pasa un puntero del archivo aIncrementalPCA.fit().

Respuestas a la pregunta(2)

Su respuesta a la pregunta