簡體   English   中英

在Python中生成非常大的2D數組?

[英]Generating very large 2D-array in Python?

我想使用列表列表生成非常大的2D數組(或換句話說,矩陣)。 每個元素應該是一個浮點數。

因此,僅舉一個例子,我們假設具有以下代碼:

import numpy as np

N = 32000

def largeMat():
    m = []
    for i in range(N):
        l = list(np.ones(N))
        m.append(l)
        if i % 1000 == 0:
            print i
    return m

m = largeMat()

我有12GB的RAM,但是當代碼到達矩陣的第10000行時,我的RAM已經滿了。 現在,如果我沒記錯的話,每個浮點數都是64位大(或8字節),所以總占用的RAM應該是:

32000 * 32000 * 8 / 1 MB = 8192 MB

為什么python會填滿我的整個RAM,甚至開始分配到swap中?

Python不一定會以最緊湊的形式存儲列表項,因為列表需要指向下一個項目的指針等。這是具有允許刪除,插入等數據類型的副作用。對於簡單的雙向鏈接列表在64位計算機中,用法是兩個指針加值,在列表中每個浮動項將是24個八位位組。 實際上,實現並不是那么愚蠢,但是仍然存在一些開銷。

如果您想使用簡潔的格式,我建議您使用numpy.array因為它將完全占用您認為需要的字節(加上少量開銷)。

編輯糟糕。 不必要。 說明錯誤,建議有效。 由於存在numpy.array ,因此numpy是正確的工具。 但是,問題很可能是其他問題。 即使花費很多時間(約2分鍾),我的計算機也將運行該過程。 此外,在此之后退出python需要很長時間(實際上,它已掛起)。 python進程的內存使用量(如top )達到10000 MB的峰值,然后降至9000 MB以下。 分配的numpy數組可能不是非常快地被垃圾回收。

但是關於我的機器中的原始數據大小:

>>> import sys
>>> l = [0.0] * 1000000
>>> sys.getsizeof(l)
8000072

因此,每個列表似乎有72個八位位組的固定開銷。

>>> listoflists = [ [1.0*i] * 1000000 for i in range(1000)]
>>> sys.getsizeof(listoflists)
9032
>>> sum([sys.getsizeof(l) for l in listoflists])
8000072000

因此,這是預期的。

另一方面,保留和填充較長的列表列表需要花費一段時間(大約10 s)。 另外,退出python需要一段時間。 對於numpy一樣:

>>> a = numpy.empty((1000,1000000))
>>> a[:] = 1.0
>>> a.nbytes
8000000000

(字節計數並不完全可靠,因為對象本身為其元數據占用了一些空間,等等。必須有一個指向存儲塊開始,數據類型,數組形狀等的指針。)

這花費更少的時間。 數組的創建幾乎是瞬時的,插入數字可能需要一兩秒鍾。 分配和釋放大量小內存塊非常耗時,雖然它不會在64位計算機中引起碎片問題,但分配大塊數據仍然要容易得多。

如果您可以將大量數據放入數組中,則有充分的理由不使用numpy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM