3

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

文件“C:\Python27\lib\site-packages\numpy\lib\npyio.py”,第 1583 行,在 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])

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

4

2 回答 2

1

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

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

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

于 2012-07-14T16:26:05.933 回答
1

根据您的操作系统和 Python 版本,您很可能永远无法分配 1GB 数组(mgilson 的答案就在此处)。问题不是内存不足,而是连续内存不足。如果您使用的是 32 位机器(尤其是运行 Windows),那么添加更多内存将无济于事。迁移到 64 位架构可能会有所帮助。

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

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

于 2012-07-14T16:34:06.427 回答