64

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

问题来了:我真的很想在 RAM 很少的蹩脚计算机上执行此操作。

有没有一种可行的方法让我在没有低 RAM 限制的情况下完成这项工作?这将花费更长的时间真的不是问题,只要时间要求不去无穷大!

我希望能够让我的算法发挥作用,然后一到五个小时后回来,并且不会因为 RAM 用完而卡住!我想在 python 中实现它,并且能够使用 numpy、scipy、sklearn 和 networkx 库。我希望能够计算到我所有点的成对距离等

这可行吗?我该怎么做,我可以开始阅读什么?

4

1 回答 1

84

使用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。并且更改已经写入磁盘。

另一个值得评论的重要事情是offset. 假设您不想取 中的前 2 行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。

其他参考:

于 2013-05-19T09:38:52.013 回答