0

所以我正在逐行读取一个csv文件。在每一行中,我逐个字段并尝试获取每个字段的大小(以字节为单位)起诉.getsizeof。代码如下:

for row in reader:
        temp1 = []
        temp2 = []
        if type(row[0]) is IntType:
            feed = feed + 1
            print feed
            # Total number of columns in a feed should be 61.
            # 61st column account for the last , after 60th column, it would always be blank.
            #if len(row) == 61:
            # Total number of columns in a feed should be 61
            for field in row:
                if type(field) == 'int':
                    field.encode('ascii', 'ignore')
                    temp1.append(sys.getsizeof(field))
                    temp2.append(str(field))

                else:
                    field = [unicode(field)]
                    #field = field.encode('ascii', 'ignore')
                    temp1.append(sys.getsizeof(field))
                    temp2.append(str(field))

由于某种原因,所有行中每个字段的大小都为 40。知道为什么吗?

4

2 回答 2

0

这可能是因为您只获得了引用的大小,而不是实际字符串字段的大小。

于 2013-07-31T20:54:42.120 回答
0

首先,这个:

field.encode('ascii', 'ignore')

......实际上并没有做任何有用的事情。它不会改变field;它只是返回一个新bytes的包含您的 ASCII 编码版本的field文件,您不会将其存储在任何地方。

最重要的是,你只在你field是一个时调用它int,在这种情况下你会得到一个AttributeError,因为int对象没有encode方法。

所以,很明显,你只是在打这个else案子。那有什么作用呢?

好吧,它创建了一个 1 元素列表。您不是在问该元素的大小,而是在问列表的大小。所以,它们都将是相同的大小。

正如文档解释的那样:

仅考虑直接归因于对象的内存消耗,而不考虑它所引用的对象的内存消耗。

那么,如果您想知道列表的大小以及其中的所有 1 个元素怎么办?下面几段有一个通用的解决方案:

有关使用递归查找容器大小及其所有内容的示例,请参见recursive sizeof recipe 。getsizeof()

但是,在您的情况下,有一个更简单的解决方案:sys.getsizeof(field) + sys.getsizeof(field[0])可以。

但请注意,这可能不是您想要的。例如,如果您有 1000 行,其中 900 行具有值'0',那么您将计算u'0'900 次……但实际上,您实际上可能只存储u'0'了 900 次引用的副本。

于 2013-07-31T19:57:51.740 回答