3

关于我在这里的另一个问题,如果我使用我的数据集的一小部分,则此代码有效,由于规则,在这部分之后dtype='int32'使用 a在我的主进程上float64产生一个TypeErrorsafe所以我会坚持使用,int32但尽管如此,我我很好奇,想知道我遇到的错误。

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[:]

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

使用int32int时出现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 个分区,驱动器 D22.8GB没有 150GB),我的工作文件包括这个脚本和 memmap 将被写入的位置和驱动器 E406GB空闲781GB)我的洪流内容去哪里了。起初,我尝试将 mmap 文件写入Drive D,它为int32生成了一个1,903,283kb 文件,为float64生成了3,806,566kb文件。我想可能是因为空间不足,这就是我收到这些错误的原因,所以我尝试了Drive E,它应该绰绰有余,但它生成了相同的文件大小并给出了相同的错误。

4

1 回答 1

4

我认为np.memmap无论您拥有多少磁盘空间,都无法使用 32 位 numpy 构建生成那么大的文件。

np.memmap尝试在内部调用时发生错误mmap.mmap。第二个参数以mmap.mmap字节为单位指定文件的长度。对于包含 64 位(8 字节)值的 329568 x 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 文件的唯一方法是小块,就像我在上面的评论中链接到的答案一样。

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

于 2016-01-04T14:07:02.393 回答