我为什么用numpy memmap收到OverflowError和WindowsError,以及如何解决?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了我为什么用numpy memmap收到OverflowError和WindowsError,以及如何解决?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3071字,纯文字阅读大概需要5分钟。
内容图文
关于我的另一个问题here,如果我使用dtype =’int32’的一小部分数据集,则此代码有效,由于安全规则,使用float64在此部分之后的主进程上会产生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))和以下dtypes:
使用int32或int时出现OverflowError
和
使用float64时出现WindowsError
为什么以及如何解决此问题?
Edit: Added Tracebacks
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
Edit: Added other info
其他可能有帮助的信息:
我有一个带2个分区的1TB(931GB可用)硬盘,D驱动器(22.8GB,不含150GB),其中我的工作文件包括此脚本,并且将写入内存映射,而E驱动器(406GB,不含781GB),其中我的洪流东西去了.最初,我尝试将mmap文件写入驱动器D,它为int32生成了1,903,283kb的文件,为float64生成了3,806,566kb的文件.我想也许是因为空间用尽了,这就是为什么我会收到这些错误,所以我尝试了Drive 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的RAM中创建一个阵列.您可能会读取CSV文件的唯一方法是将其分成小块,例如我在上面的评论中链接到的答案here.
正如我在对其他问题的评论中提到的那样,您应该做的是将TermDocumentMatrix转换为scipy.sparse矩阵,而不是将其写入CSV文件.这将需要少得多的存储空间和RAM,因为它可以利用几乎所有字数均为零的事实.
内容总结
以上是互联网集市为您收集整理的我为什么用numpy memmap收到OverflowError和WindowsError,以及如何解决?全部内容,希望文章能够帮你解决我为什么用numpy memmap收到OverflowError和WindowsError,以及如何解决?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。