2017-01-30 26 views
2

我希望加載儘可能多的數據,因爲這是安全的,以便當前進程可以正常工作以及處理其他進程。我寧願只使用RAM(不使用交換),但歡迎任何建議。過多的數據可以丟棄。這樣做的正確方法是什麼?如果我只是等待MemoryException,系統變得不可操作(如果使用列表)。如何使用所有可用內存

data_storage = [] 
for data in read_next_data(): 
    data_storage.append(data) 

數據最終被加載到numpy數組中。

+0

假設你使用Linux,你可能會確定它的nice和ionice值真的很差,並加載任何你喜歡的東西。 – ti7

回答

4

psutil具有virtual_memory功能包含,別人旁邊,代表空閒內存的屬性:

>>> psutil.virtual_memory() 
svmem(total=4170924032, available=1743937536, percent=58.2, used=2426986496, free=1743937536) 

>>> psutil.virtual_memory().free 
1743937536 

這應該是相當準確的(但函數調用是昂貴的-slow-至少在Windows上)。 MemoryError不考慮其他進程使用的內存,因此只有當數組的內存超出總可用(免費或不可用)RAM時纔會引發。

您可能不得不猜測,此時你停止累計因爲可用內存可以改變(其他進程也需要時不時一些額外的內存)和轉換至numpy.array可能即暫時增加一倍,你使用的內存,因爲當時列表和數組必須適合你的RAM。


但是你可以接近這個也用另一種方式:在第一數據集

  • 閱讀:read_next_data()
  • 在該點處計算的空閒內存:psutil.virtual_memory().free
  • 使用第一數據集的shapedtype計算能輕鬆到RAM陣列的形狀。假設它使用可用空閒內存的factor(即75%):rows= freeMemory * factor/(firstDataShape * memoryPerElement)應該給你一次讀入的數據集的數量。
  • 創建該形狀的數組:arr = np.empty((rows, *firstShape), dtype=firstDtype)
  • 加載下一個數據集,但直接將它們存儲到您的數組中arr[i] = next(read_next_data)。這樣你就不會保留這些列表,並且避免了加倍的內存。
相關問題