在python和numpy中处理大数据时,内存不足,如何将部分结果保存在光盘上?

在python和numpy中处理大数据时,内存不足,如何将部分结果保存在光盘上?,python,arrays,numpy,scipy,bigdata,Python,Arrays,Numpy,Scipy,Bigdata,我试图用python实现1000维数据和200k+数据点的算法。我想使用numpy、scipy、sklearn、networkx和其他有用的库。我想执行诸如所有点之间的成对距离之类的操作,并对所有点进行聚类。我已经实现了工作算法,它们以合理的复杂度执行我想要的操作,但是当我尝试将它们扩展到我所有的数据时,我的ram就用完了。当然,在200k+数据上创建成对距离矩阵需要大量内存 问题来了:我真的很想在内存不足的糟糕电脑上这样做 是否有一个可行的方法,我使这项工作没有限制的低内存。这将需要更长的时间

我试图用python实现1000维数据和200k+数据点的算法。我想使用numpy、scipy、sklearn、networkx和其他有用的库。我想执行诸如所有点之间的成对距离之类的操作,并对所有点进行聚类。我已经实现了工作算法,它们以合理的复杂度执行我想要的操作,但是当我尝试将它们扩展到我所有的数据时,我的ram就用完了。当然,在200k+数据上创建成对距离矩阵需要大量内存

问题来了:我真的很想在内存不足的糟糕电脑上这样做

是否有一个可行的方法,我使这项工作没有限制的低内存。这将需要更长的时间,这真的不是一个问题,只要时间需求不到无穷大

我希望能够把我的算法工作,然后回来一个或五个小时后,而不是有它卡住,因为它用完了内存!我想用python实现这一点,并且能够使用numpy、scipy、sklearn和networkx库。我希望能够计算到我所有点的成对距离等

这是否可行?我该怎么做,我能开始读什么

致意
//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

其他参考资料:


例如,我希望能够在python中执行200.000 x 1000矩阵中所有点之间的成对距离,而不需要足够的ram将整个距离矩阵保存在内存中。我正在寻找关于如何做到这一点的信息:)所以更具体的答案,然后模糊的“研究计算机科学的两个完整的子领域”将是有益的!你可能想看看numpy,也许可以作为一个起点。从下面的第一个相关问题开始,用户@cronos向你建议,我相信它也可以用于解决你的问题。1-2-对不起,我不明白你做了什么。您是否使用名为“test.mymemmap”的“w+”创建了一个文件,并通过分配变量“a”将其存储到内存中。但是您删除了它,然后使用“r+”读取文件并存储在变量“b”中。我不确定你做了什么。我有一个名为“myfile.npy”的大文件,我想分批读取它。。。