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
- 使用第一數據集的
shape
和dtype
計算能輕鬆到RAM陣列的形狀。假設它使用可用空閒內存的factor
(即75%):rows= freeMemory * factor/(firstDataShape * memoryPerElement)
應該給你一次讀入的數據集的數量。
- 創建該形狀的數組:
arr = np.empty((rows, *firstShape), dtype=firstDtype)
。
- 加載下一個數據集,但直接將它們存儲到您的數組中
arr[i] = next(read_next_data)
。這樣你就不會保留這些列表,並且避免了加倍的內存。
假設你使用Linux,你可能會確定它的nice和ionice值真的很差,並加載任何你喜歡的東西。 – ti7