内存错误:numpy.genfromtxt()

时间:2012-07-14 16:18:49

标签: python memory numpy scipy

我有一个50,000x5,000矩阵(浮点)文件。当使用x = np.genfromtxt(readFrom, dtype=float)将文件加载到内存时,我收到以下错误消息:

  

文件“C:\ Python27 \ lib \ site-packages \ numpy \ lib \ npyio.py”,第1583行,   in genfromtxt for(i,converter)in enumerate(converters)])
  的MemoryError

我想将整个文件加载到内存中,因为我使用Scipy计算每个向量之间的欧氏距离。 dis = scipy.spatial.distance.euclidean(x[row1], x[row2])

是否有任何有效的方法将巨大的矩阵文件加载到内存中。

谢谢。

Update:

我设法解决了这个问题。这是我的解决方案。我不确定它是否有效或逻辑正确,但对我来说效果很好:

x = open(readFrom, 'r').readlines()
y = np.asarray([np.array(s.split()).astype('float32') for s in x], dtype=np.float32)
....
dis = scipy.spatial.distance.euclidean(y[row1], y[row2])

请帮我改进我的解决方案。

2 个答案:

答案 0 :(得分:1)

你实际上使用8字节浮点数,因为python的float对应于C的double(至少在大多数系统上):

a=np.arange(10,dtype=float)
print(a.dtype)  #np.float64

您应将数据类型指定为np.float32。根据您的操作系统,无论是32位还是64位,(无论您使用的是32位python还是64位python),可供numpy使用的地址空间可能小于4Gb,这也可能是一个问题

答案 1 :(得分:1)

根据您的操作系统和Python版本,您很可能永远无法分配1GB阵列(mgilson的答案就在这里)。问题不在于你的内存不足,而是你的连续内存不足。如果您使用的是32位计算机(尤其是运行Windows),则无法添加更多内存。迁移到64位架构可能会有所帮助。

使用较小的数据类型肯定有帮助;根据您使用的操作,16位浮点数甚至8位int可能就足够了。

如果这些都不起作用,那么你不得不承认数据不适合内存。你必须分段处理它(在这种情况下,将数据存储为HDF5数组可能非常有用)。