为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

摇曳的蔷薇 2019-10-28 10:42:04
我正在尝试在python中使用200k +数据点实现1000维数据的算法。我想使用numpy,scipy,sklearn,networkx和其他有用的库。我想执行所有点之间的成对距离等操作,并在所有点上进行聚类。我已经实现了可以有效实现所需功能的有效算法,但是当我尝试将它们扩展到我的所有数据时,我的内存就用光了。当然可以,在200k +的数据上为成对距离创建矩阵会占用大量内存。这里有个要注意的地方:我真的很想在内存低,内存不足的笨拙的计算机上执行此操作。有没有一种可行的方法可以使我在没有低内存限制的情况下进行这项工作。只要时间要求不等于无穷大,那将花费更长的时间确实不是问题!我希望能够使用我的算法,然后一小时或五个小时再返回,并且不会卡死,因为它用完了内存!我想在python中实现此功能,并且能够使用numpy,scipy,sklearn和networkx库。我希望能够计算到我所有点的成对距离等这可行吗?我将如何处理它,我可以开始阅读什么?最好的问候//梅斯默
查看完整描述

3 回答

?
九州编程

TA贡献1785条经验 获得超4个赞

使用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    

您可以将其视为常规数组:+ = 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。


查看完整回答
反对 回复 2019-10-28
?
守着星空守着你

TA贡献1799条经验 获得超8个赞

您可以在OS上增加虚拟内存并使用64位python,前提是它是64位os。


查看完整回答
反对 回复 2019-10-28
?
倚天杖

TA贡献1828条经验 获得超3个赞

32位进程仅限于2Gb RAM(虚拟或其他)。这是因为32位仅允许寻址4Gb,而OS保留2Gb。可以将其调整为3Gb / 1Gb,但这是您的限制。解决此问题的唯一其他方法是使用多进程模块将程序拆分为单独的进程,每个进程限制为2Gb

查看完整回答
反对 回复 2019-10-28
  • 3 回答
  • 0 关注
  • 4553 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信