我正在尝试在python中实现具有200k +数据点的1000维数据的算法。我想使用numpy,scipy,sklearn,networkx和其他有用的库。我想执行所有点之间的成对距离等操作,并在所有点上进行聚类。我已经实现了以合理的复杂度执行我想要的工作算法但是当我尝试将它们扩展到我的所有数据时,我用完了ram。我当然这样做,在200k +数据上创建成对距离的矩阵需要很多内存。
这里有一个问题:我真的很想在具有少量内存的糟糕计算机上执行此操作。
有没有可行的方法让我在没有低ram限制的情况下完成这项工作。这需要更长的时间才真正不是问题,只要时间要求不会无限!
我希望能够将我的算法运行起来,然后在一小时或五小时之后再回来,而不是因为它用完ram而卡住了!我想在python中实现它,并能够使用numpy,scipy,sklearn和networkx库。我希望能够计算到我所有点的成对距离等
这可行吗?我将如何解决这个问题,我可以开始阅读哪些内容?
祝你好运 // Mesmer
答案 0 :(得分:51)
使用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
。并且更改已经写在磁盘上。
另一个值得评论的重要事情是b
。假设你不想要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
中的前2行,而是150000和150001行。
{{1}}
现在,您可以在同时操作中访问和更新阵列的任何部分。请注意偏移计算中的字节大小。因此,对于'float64',这个例子将是150000 * 1000 * 64/8。
其他参考资料:
答案 1 :(得分:-3)
你可以在操作系统上增加虚拟内存并使用64位python,只要它是一个64位的操作系统。