我使用python库进行深度学习和神经网络。我正在运行的计算机有16 gb的@ 1866 MHz ram。起初我的输入数据文件太大了,所以我把它打破了:
-rw-rw-r-- 1 jt jt 1.8G Mar 20 18:09 covarFile.pkl
引起的:
Traceback (most recent call last):
File "PYJT2/pp_dbn.py", line 69, in <module>
go()
File "PYJT2/pp_dbn.py", line 32, in go
model = cPickle.load(open(CONTROL_DBN.INPUT, "rb"))
MemoryError
由于该文件只是numpy数组的numpy数组,我可以将其分解为单独的文件,并通过加载大量的pickle文件在程序中动态地重新创建更大的文件。
total 5.2G
drwxrwxr-x 2 jt jt 4.0K Mar 20 18:15 ./
drwxrwxr-x 4 jt jt 4.0K Mar 20 18:15 ../
-rw-rw-r-- 1 jt jt 351M Mar 20 18:09 outfile-0.pkl
-rw-rw-r-- 1 jt jt 351M Mar 20 18:11 outfile-10.pkl
-rw-rw-r-- 1 jt jt 351M Mar 20 18:11 outfile-11.pkl
-rw-rw-r-- 1 jt jt 351M Mar 20 18:12 outfile-12.pkl
-rw-rw-r-- 1 jt jt 351M Mar 20 18:12 outfile-13.pkl
-rw-rw-r-- 1 jt jt 351M Mar 20 18:12 outfile-14.pkl
-rw-rw-r-- 1 jt jt 2.3M Mar 20 18:12 outfile-15.pkl
-rw-rw-r-- 1 jt jt 351M Mar 20 18:09 outfile-1.pkl
-rw-rw-r-- 1 jt jt 351M Mar 20 18:09 outfile-2.pkl
-rw-rw-r-- 1 jt jt 351M Mar 20 18:10 outfile-3.pkl
-rw-rw-r-- 1 jt jt 351M Mar 20 18:10 outfile-4.pkl
-rw-rw-r-- 1 jt jt 351M Mar 20 18:10 outfile-5.pkl
-rw-rw-r-- 1 jt jt 351M Mar 20 18:10 outfile-6.pkl
-rw-rw-r-- 1 jt jt 351M Mar 20 18:11 outfile-7.pkl
-rw-rw-r-- 1 jt jt 351M Mar 20 18:11 outfile-8.pkl
-rw-rw-r-- 1 jt jt 351M Mar 20 18:11 outfile-9.pkl
这个解决方案运行正常。 我的问题现在我有一个引起MemoryError
的文件,我不知道如何进一步分解。它是一个theano张量变量,表示30,000x30,000的浮点数矩阵。我的问题:
答案 0 :(得分:1)
首先,pkl不能很好地保存二进制数据并且不是内存友好的。它必须在写入磁盘之前复制ram中的所有数据。所以这个内存使用量加倍了!您可以使用numpy.save和numpy.load来存储ndarray而不会使内存翻倍。
对于Theano变量,我猜你使用的是Theano共享变量。默认情况下,当您通过get_value()
获取时,它会复制数据。您可以使用get_value(borrow=True)
不要复制此内容。
这两种变化可以将内存使用量降低3倍。如果这还不够,或者你不想自己处理多个文件,我建议你使用pytables:http://www.pytables.org/它允许将一个大的ndarray存储在比ram avaiable更大的文件中,但它给出了一个类似于ndarray的对象,你可以非常类似于ndarray进行操作。