在python和numpy中处理大数据时,内存不足,如何将部分结果保存在光盘上?
我试图用python实现1000维数据和200k+数据点的算法。我想使用numpy、scipy、sklearn、networkx和其他有用的库。我想执行诸如所有点之间的成对距离之类的操作,并对所有点进行聚类。我已经实现了工作算法,它们以合理的复杂度执行我想要的操作,但是当我尝试将它们扩展到我所有的数据时,我的ram就用完了。当然,在200k+数据上创建成对距离矩阵需要大量内存 问题来了:我真的很想在内存不足的糟糕电脑上这样做 是否有一个可行的方法,我使这项工作没有限制的低内存。这将需要更长的时间,这真的不是一个问题,只要时间需求不到无穷大 我希望能够把我的算法工作,然后回来一个或五个小时后,而不是有它卡住,因为它用完了内存!我想用python实现这一点,并且能够使用numpy、scipy、sklearn和networkx库。我希望能够计算到我所有点的成对距离等 这是否可行?我该怎么做,我能开始读什么 致意在python和numpy中处理大数据时,内存不足,如何将部分结果保存在光盘上?,python,arrays,numpy,scipy,bigdata,Python,Arrays,Numpy,Scipy,Bigdata,我试图用python实现1000维数据和200k+数据点的算法。我想使用numpy、scipy、sklearn、networkx和其他有用的库。我想执行诸如所有点之间的成对距离之类的操作,并对所有点进行聚类。我已经实现了工作算法,它们以合理的复杂度执行我想要的操作,但是当我尝试将它们扩展到我所有的数据时,我的ram就用完了。当然,在200k+数据上创建成对距离矩阵需要大量内存 问题来了:我真的很想在内存不足的糟糕电脑上这样做 是否有一个可行的方法,我使这项工作没有限制的低内存。这将需要更长的时间
//Mesmer使用
numpy.memmap
可以创建直接映射到文件中的数组:
import numpy
a = numpy.memmap('test.mymemmap', dtype='float32', mode='w+', shape=(200000,1000))
# here you will see a 762MB file created in your working directory
您可以将其视为常规阵列:
a+=1000
甚至可以将更多数组分配给同一个文件,如果需要,可以从相互的源控制它。但我在这里经历了一些棘手的事情。要打开整个阵列,必须先使用del
“关闭”上一个阵列:
del a
b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(200000,1000))
但仅打开阵列的一部分可以实现同步控制:
b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000))
b[1,5] = 123456.
print a[1,5]
#123456.0
太好了<代码>a与b
一起更改。并且更改已经写入磁盘
另一个值得评论的重要内容是偏移量
。假设您不想取b
中的前两行,而是取150000行和150001行
b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000),
offset=150000*1000*32/8)
b[1,2] = 999999.
print a[150001,2]
#999999.0
现在,您可以同时访问和更新阵列的任何部分。注意偏移量计算中的字节大小。因此,对于“float64”,这个示例将是150000*1000*64/8
其他参考资料: