亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在python和numpy中處理大數據,但內存不足,如何在磁盤上保存部分結果?

在python和numpy中處理大數據,但內存不足,如何在磁盤上保存部分結果?

HUWWW 2019-12-11 14:09:12
我正在嘗試在python中使用200k +數據點實現1000維數據的算法。我想使用numpy,scipy,sklearn,networkx和其他有用的庫。我想執行所有點之間的成對距離等操作,并在所有點上進行聚類。我已經實現了可以有效實現所需功能的有效算法,但是當我嘗試將它們擴展到我的所有數據時,我的內存就用光了。當然可以,在200k +的數據上為成對距離創建矩陣會占用大量內存。這里有個要注意的地方:我真的很想在內存低,內存不足的笨拙的計算機上執行此操作。有沒有一種可行的方法可以使我在沒有低內存限制的情況下進行這項工作。只要時間要求不等于無窮大,那將花費更長的時間確實不是問題!我希望能夠使用我的算法,然后一小時或五個小時再返回,并且不會卡死,因為它用完了內存!我想在python中實現此功能,并且能夠使用numpy,scipy,sklearn和networkx庫。我希望能夠計算到我所有點的成對距離等這可行嗎?我將如何處理它,我可以開始閱讀什么?最好的問候//梅斯默
查看完整描述

3 回答

?
手掌心

TA貢獻1942條經驗 獲得超3個贊

使用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-12-12
?
拉風的咖菲貓

TA貢獻1995條經驗 獲得超2個贊

您可以在OS上增加虛擬內存并使用64位python,前提是它是64位os。

查看完整回答
反對 回復 2019-12-12
?
紅糖糍粑

TA貢獻1815條經驗 獲得超6個贊

32位進程僅限于2Gb RAM(虛擬或其他)。這是因為32位僅允許尋址4Gb,而OS保留2Gb??梢詫⑵湔{整為3Gb / 1Gb,但這是您的限制。解決此問題的唯一其他方法是使用多進程模塊將程序拆分為單獨的進程,每個進程限制為2Gb

查看完整回答
反對 回復 2019-12-12
  • 3 回答
  • 0 關注
  • 360 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號