关于我的另一个问题here,如果我使用dtype='int32'
的数据集的一小部分,使用float64
在这一部分之后由于safe
规则在主进程上产生一个typeerror,那么这段代码就可以工作,因此我将坚持使用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[:]
如果我使用完整数据(其中
shape=(329568, 27519)
),这些数据类型:当我使用int32或int时会出现溢出错误
和
当我使用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(931GB可用)的硬盘,有两个分区,驱动器D(22.8GB可用,150GB可用),我的工作文件包括这个脚本,memmap将在其中写入,驱动器E(406GB可用,781GB可用),我的Torrent内容将在其中。起初,我试图将mmap文件写入驱动器D,它为int32生成了1903283kb文件,为float64生成了3806566kb文件我想可能是因为空间不足,所以才会出现这些错误,所以我尝试了驱动器e,它应该足够多,但它生成了相同的文件大小,并给出了相同的错误。
最佳答案
我认为使用32位的numpy构建不可能生成这么大的np.memmap
文件,不管您有多少磁盘空间。
当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)
肯定会失败,因为它需要在内存中创建一个32GB的数组您唯一可能读取csv文件的方法是将文件分成小块,就像我在上面的注释中链接到的答案here中那样。
正如我在您的另一个问题的注释中提到的,您应该做的是将
TermDocumentMatrix
转换为scipy.sparse
矩阵,而不是将其写入CSV文件这将需要少得多的存储空间和RAM,因为它可以利用几乎所有的字数都是零值的这一事实。