2014-10-31 65 views
0

我有一個很大的二進制文件,我想使用struct.unpack()解壓縮並解壓縮() 這個文件由多個2957字節長的行組成。爲什麼sys.getsizeof()不能在Python中的file.read([size])中返回[size]

with open("bin_file", "rb") as f: 
    line = f.read(2957) 

我的問題是爲什麼,是由大小返回:

import sys 
sys.getsizeof(line) 

不等於2957(在我的情況下,它是2978) 我在文件中使用下面的代碼看?

+0

你在用什麼'sys.getsizeof'? – hobbs 2014-10-31 17:52:48

+0

@hobbs我沒有特別使用它,我只是注意到了這種差異,並想知道爲什麼是這種情況 – samuelschaefer 2014-10-31 17:58:46

+0

所有這些與文件I/O無關;你會得到'line =''* 2957'的相同結果。 – 2014-10-31 18:13:24

回答

7

您誤解了什麼sys.getsizeof()確實。它返回Python用於字符串對象的內存量,而不是行的長度。

Python字符串對象跟蹤引用計數,對象類型和其他元數據連同實際字符,所以2978字節是而不是與字符串長度相同。

stringobject.h definition of the type

typedef struct { 
    PyObject_VAR_HEAD 
    long ob_shash; 
    int ob_sstate; 
    char ob_sval[1]; 

    /* Invariants: 
    *  ob_sval contains space for 'ob_size+1' elements. 
    *  ob_sval[ob_size] == 0. 
    *  ob_shash is the hash of the string or -1 if not computed yet. 
    *  ob_sstate != 0 iff the string object is in stringobject.c's 
    *  'interned' dictionary; in this case the two references 
    *  from 'interned' to this object are *not counted* in ob_refcnt. 
    */ 
} PyStringObject; 

其中PyObject_VAR_HEADobject.h,其中標準ob_refcntob_typeob_size字段都被定義定義。

所以一個長度爲2957的字符串需要2958個字節(字符串長度爲空),其餘的20個字節用於保存引用計數,類型指針,對象'size'(字符串長度),緩存字符串散列和interned狀態標誌。

其他對象類型將具有不同的內存佔用,並且所使用的C類型的確切大小也因平臺而異。

+0

@ user2357112:是的,速度閱讀失敗。糾正。 – 2014-10-31 17:58:54

3

由於諸如類型指針和引用計數之類的開銷,表示2957個字節的數據的字符串對象需要超過2957個字節的內存來表示。 sys.getsizeof包含此額外開銷。

相關問題