2012-07-14 66 views
2

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

File "C:\Python27\lib\site-packages\numpy\lib\npyio.py", line 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]) 

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

+1

计算所有向量对的距离将花费比加载文件长得多的时间。重新检查一下,如果你真的需要所有的矢量对。另外,你将需要至少25 * 10^7 * 4 = 10^9字节,也许2 * 10^9字节 - 后者在32位系统上是不可行的。 – krlmlr 2012-07-14 16:28:02

+0

看看http://stackoverflow.com/q/1896674/1301710 – bmu 2012-07-14 17:49:48

回答

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,这可能也是一个问题。

+0

即使我使用'dtype = np.float32',我得到了内存错误。 – Maggie 2012-07-14 16:34:46

+0

@Mahin如果你只是这样做:>>> a = np.zeros((50000,5000),dtype = np.float32); a = 1'而不是你的'np.genfromtxt'? – mgilson 2012-07-14 16:45:56

+0

它工作正常。没有内存错误 – Maggie 2012-07-14 16:51:54

1

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

使用较小的数据类型当然可以提供帮助;取决于您使用的操作,16位浮点数或甚至8位整数可能就足够了。

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