使用python和numpy中的大数据,没有足够的ram,如何在光盘上保存部分结果?

Ekg*_*ren 48 python arrays numpy scipy bigdata

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

接下来是:我真的很想在具有少量内存的糟糕计算机上执行此操作.

有没有可行的方法让我在没有低ram限制的情况下完成这项工作.它需要更长的时间才真正不是问题,只要时间要求不会无限!

我希望能够让我的算法工作,然后在一小时或五个小时后回来,而不是因为它用完了公羊而被卡住了!我想在python中实现它,并能够使用numpy,scipy,sklearn和networkx库.我希望能够计算到我所有点的成对距离等

这可行吗?我将如何解决这个问题,我可以开始阅读哪些内容?

最好的问候//梅斯默

Sau*_*tro 63

使用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    
Run Code Online (Sandbox Code Playgroud)

您可以将其视为传统阵列:a + = 1000.

甚至可以将更多数组分配给同一个文件,如果需要,可以从相互来源控制它.但我在这里经历了一些棘手的事情.要打开完整数组,您必须首先"关闭"前一个数组,使用del:

del a    
b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(200000,1000))
Run Code Online (Sandbox Code Playgroud)

但是只打开数组的某些部分可以实现同步控制:

b = numpy.memmap('test.mymemmap', dtype='float32', mode='r+', shape=(2,1000))
b[1,5] = 123456.
print a[1,5]
#123456.0
Run Code Online (Sandbox Code Playgroud)

大!a与...一起改变了b.并且更改已写入磁盘.

另一个值得评论的重要事情是offset.假设您不想要前两行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
Run Code Online (Sandbox Code Playgroud)

现在,您可以在同时操作中访问和更新阵列的任何部分.请注意偏移计算中的字节大小.因此对于'float64',这个例子将是150000*1000*64/8.

其他参考:

  • 抱歉,我不明白你做了什么。您是否使用“w+”创建了一个名为“test.mymemmap”的文件,并通过分配变量“a”将其存储到内存中。但随后您已将其删除,然后使用“r+”读取该文件并将其存储在变量“b”中。我不确定你做了什么。我有一个名为“myfile.npy”的大文件,我想批量读取它...... (2认同)