为什么我得到一个带有numpy memmap的OverflowError和WindowsError以及如何解决它?

时间:2016-01-04 11:02:33

标签: python numpy numpy-memmap

关于我的其他问题here,如果我使用dtype='int32'的一小部分数据集,则此代码有效,使用float64生成 TypeError 由于safe规则,在此部分之后我的主要流程上,所以我会坚持使用int32,但是,我很好奇并且想知道错误我和#39}我得到了。

fp = np.memmap("E:/TDM-memmap.txt", dtype='int32', mode='w+', shape=(len(documents), len(vocabulary)))
matrix = np.genfromtxt("Results/TDM-short.csv", dtype='int32', delimiter=',', skip_header=1)
fp[:] = matrix[:]

如果我使用完整数据(shape=(329568, 27519)),请使用这些 dtypes

当我使用 int32 int

时,我得到 OverflowError

当我使用 float64

时,我得到 WindowsError

为什么以及如何解决此问题?

  

编辑:添加了回溯

追溯 int32

Traceback (most recent call last):
File "C:/Users/zeferinix/PycharmProjects/Projects/NLP Scripts/NEW/LDA_Experimental1.py", line 123, in <module>
    fp = np.memmap("E:/TDM-memmap.txt", dtype='int32', mode='w+', shape=(len(documents), len(vocabulary)))
File "C:\Python27\lib\site-packages\numpy\core\memmap.py", line 260, in __new__
    mm = mmap.mmap(fid.fileno(), bytes, access=acc, offset=start)
WindowsError: [Error 8] Not enough storage is available to process this command

追溯 float64

Traceback (most recent call last):
File "C:/Users/zeferinix/PycharmProjects/Projects/NLP Scripts/NEW/LDA_Experimental1.py", line 123, in <module>
    fp = np.memmap("E:/TDM-memmap.txt", dtype='float64', mode='w+', shape=(len(documents), len(vocabulary)))
File "C:\Python27\lib\site-packages\numpy\core\memmap.py", line 260, in __new__
    mm = mmap.mmap(fid.fileno(), bytes, access=acc, offset=start)
OverflowError: cannot fit 'long' into an index-sized integer
  

编辑:添加了其他信息

其他可能有用的信息: 我有一个1TB(931 GB可用)硬盘驱动器,带有2个分区,驱动器D 22.8GB 不含150GB)我的工作文件包含此脚本,以及memmap将在哪里写好驱动E 406GB 免费781GB)我的洪流东西。起初我尝试将mmap文件写入驱动器D ,并为 int32 3,806,566kb 生成 1,903,283kb文件 strong> float64 的文件。我想也许是因为它的空间不足以及我为什么会遇到这些错误,所以我尝试了驱动器E 这应该绰绰有余但它生成了相同的文件大小并给出了相同的文件大小同样的错误。

1 个答案:

答案 0 :(得分:4)

我认为无论你拥有多少磁盘空间,都可以使用32位numpy构建生成np.memmap大文件。

np.memmap尝试在内部调用mmap.mmap时发生错误。 mmap.mmap的第二个参数指定文件的长度(以字节为单位)。对于包含64位(8字节)值的329568乘27519数组,长度将为72555054336字节(即~72GB)。

需要将值72555054336转换为可用作索引的整数类型。在32位Python中,索引需要是32位整数值。但是,32位整数可以表示的最大数字远小于72555054336:

print(np.iinfo(np.int32(1)).max)
# 2147483647

即使是32位数组也需要36277527168字节的长度,这仍然比最大可表示的32位整数大16倍。

除了切换到64位Python / numpy之外,我没有看到解决这个问题的任何简单方法。还有其他很好的理由 - 32位Python只能处理最多3GB的RAM,即使你的机器有8GB可用。

即使您可以生成np.memmap那么大,下一行

matrix = np.genfromtxt("Results/TDM-short.csv", dtype='int32', delimiter=',', skip_header=1)

肯定会失败,因为它需要在RAM中创建一个32GB大小的数组。您可能阅读该CSV文件的唯一方法是使用较小的块,例如我在上面的评论中链接的答案here

正如我在您对其他问题的评论中所提到的,您应该做的是将TermDocumentMatrix转换为scipy.sparse矩阵,而不是将其写入CSV文件。这将需要更多,更少的存储空间和RAM,因为它可以利用几乎所有字数都为零值的事实。