【问题标题】:Why does sys.getsizeof() not return [size] in file.read([size]) in Python为什么 sys.getsizeof() 在 Python 中的 file.read([size]) 中不返回 [size]
【发布时间】:2014-10-31 17:50:45
【问题描述】:

我有一个大的二进制文件,我想读入并使用 struct.unpack() 解压 该文件由多行组成,每行 2957 字节长。 我使用以下代码读入文件:

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

我的问题是为什么,返回的大小是:

import sys
sys.getsizeof(line)

不等于 2957(在我的例子中是 2978)?

【问题讨论】:

  • 你用sys.getsizeof做什么?
  • @hobbs 我没有特别使用它,我只是注意到了差异,想知道为什么会这样
  • 这一切都与文件I/O无关;你会得到与line = ' ' * 2957 相同的结果。

标签: python string file-io


【解决方案1】:

你误解了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_HEAD 定义在object.h 中,其中标准的ob_refcntob_typeob_size 字段均已定义。

所以一个长度为 2957 的字符串占用 2958 个字节(字符串长度 + null),剩下的 20 个字节用于保存引用计数、类型指针、对象“大小”(此处为字符串长度)、缓存的字符串哈希和被拘留的状态标志。

其他对象类型将具有不同的内存占用,并且所使用的 C 类型的确切大小也因平台而异。

【讨论】:

    【解决方案2】:

    由于类型指针和引用计数等开销,表示 2957 字节数据的字符串对象占用超过 2957 字节的内存来表示。 sys.getsizeof 包括这个额外的开销。

    【讨论】:

      猜你喜欢
      • 2014-12-24
      • 2015-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多