0

我正在使用 python 库进行深度学习和神经网络。我正在运行的计算机有 16 GB 的 ram@1866 MHz。起初我的输入数据文件太大,所以我把它弄小了:

-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 浮点数矩阵。我的问题:

  1. 即使您不确定如何划分底层数据结构,是否有一种方法可以跨多个 pkl 文件保存内容?
  2. 在我们的实验室服务器(48 GB)上运行它会更好吗?还是这个内存错误与架构无关?
  3. 我现在拥有的巨大的 pkl 文件是否太大而无法使用?我希望不是,那是大约 8 个小时的神经网络训练。
  4. 除了使用任何人都能想到的数据库之外,还有其他解决方案吗?如果可能的话,我强烈希望使用数据库,因为我已经不得不将软件转移到许多服务器上,其中许多我没有 root 访问权限,并且安装其他东西很痛苦。
4

1 回答 1

1

首先,pkl 不能很好地保存二进制数据并且对内存不友好。它必须在写入磁盘之前复制内存中的所有数据。所以这使内存使用量增加了一倍!您可以使用 numpy.save 和 numpy.load 来存储 ndarray 而不会使内存加倍。

对于 Theano 变量,我猜您使用的是 Theano 共享变量。默认情况下,当您通过 获取它时get_value(),它会复制数据。您可以使用get_value(borrow=True)不复制此内容。

这两项更改一起可以将内存使用量降低 3 倍。如果这还不够,或者如果您厌倦了自己处理多个文件,我建议您使用 pytables:http ://www.pytables.org/它允许将一个大的 ndarray 存储在比 ram 更大的文件中可用,但它提供了一个类似于 ndarray 的对象,您可以非常类似于 ndarray 来操作它。

于 2014-04-01T00:27:01.520 回答