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 エンコード バージョンを保持するnew を返すだけです。field

その上、オブジェクトがメソッドを持たないため、あなたfieldintである場合にのみ呼び出すことができます。AttributeErrorintencode

したがって、明らかに、あなたはelseケースにぶつかっているだけです。そして、それは何をしますか?

まあ、それは1要素のリストを作ります。その要素のサイズではなく、リストのサイズを求めています。したがって、それらはすべて同じサイズになります。

ドキュメントが説明しているように:

オブジェクトが参照するオブジェクトのメモリ消費ではなく、オブジェクトに直接起因するメモリ消費のみが考慮されます。

では、リストのサイズとその要素の 1 つすべてを知りたい場合はどうなるでしょうか。数段落下に汎用ソリューションがあります。

再帰的に使用してコンテナーとそのすべての内容のサイズを見つける例については、recursive sizeof レシピを参照してください。getsizeof()

ただし、あなたの場合、はるかに簡単な解決策sys.getsizeof(field) + sys.getsizeof(field[0])があります。

ただし、これはあなたが望んでいたものではないかもしれないことに注意してください。たとえば、1000 行があり、そのうちの 900 行が値 を持っている場合、900 回'0'カウントすることになりますu'0'が、実際には、900 回のu'0'参照を含む のコピーを 1 つだけ保存していることになります。

于 2013-07-31T19:57:51.740 に答える