-4

レコードのリストを HTML に送信しているときに、ページがわずか 1500 レコードで非常に遅いことがわかりました。調査の結果、わずか 1500 レコードに対して大量のデータが渡されていることがわかりました。それは 3 ~ 4 MB でした。各行には 6 つの値があり、すべてが文字列で、そのうちの 2 つは日時オブジェクトです。

私が見回したところ、辞書は重く、辞書をデータのタプルに変更すると、別のページの負荷が軽減されることがわかりました。しかし、最初のページでは、送信するのは 1000 レコードのリストだけなので、これはリストのリストです。

firebug を使用して各レコードに送信されているデータの量を調べてみたところ、1 レコードあたり 1 kb を超えるデータであることがわかりました。

私のアプリケーションはすべてのデータが既に圧縮されている Web アプリケーションであるため、これはパフォーマンスの問題です。

何がうまくいかないのか、誰か助けてもらえますか?,Pythonのリストとオブジェクトは本当に重いですか?

また、これをさらに調べる方法があれば教えてください。

4

1 に答える 1

1

これにより、使用されているメモリの量が表示されます。

import sys

a = ["abcdef", "ghijklmnop"]
sys.getsizeof(a)    # => 44 (size of list a in bytes)

「リストを HTML に送信する」と言うとき、ページを Python でレンダリングすることについて話しているのですか、それとも JSON として送信しているのですか? 必要最小限のデータのみを送信していますか、それとも「すべて」を送信してからフィルタリングしていますか?

.

編集:良い点。以下はどうでしょう。

import sys
import datetime

def show_mem(data, indent="    ", depth=0):
    "Recursively show the memory usage of a data structure"
    mysize = sys.getsizeof(data)
    if isinstance(data, (list,tuple,dict)):
        childsize = 0
        print("{}{} bytes: [".format(indent*depth, mysize))
        for d in data:
            childsize += show_mem(d, indent, depth+1)
        print("{}]  (total: {} bytes)".format(indent*depth, mysize+childsize))
        return mysize+childsize
    else:
        print("{}{} bytes: {}".format(indent*depth, mysize, repr(data)))
        return mysize

show_mem([1223456, 1245361536363, 'infooooooooo123', datetime.date(1975,7,21), "http://www.somesite.org/the/path/page.htm"])

返す

56 bytes: [
    12 bytes: 1223456
    18 bytes: 1245361536363L
    36 bytes: 'infooooooooo123'
    20 bytes: datetime.date(1975, 7, 21)
    62 bytes: 'http://www.somesite.org/the/path/page.htm'
]  (total: 204 bytes)

.

編集 #2: (1 つのレコードでレンダリングされたページ) と (2 つのレコードでレンダリングされたページ) で diff を実行する必要があります。これにより、1 つのレコードを追加した場合のページの結果が正確に表示されます。HTML に多くの非表示の属性が含まれているか、インライン Javascript がサイズを膨らませている可能性があります。

つまり、Linux コマンド ラインでは次のようになります。

diff -b saved_one_record.html saved_two_records.html

次のようなものを返す必要があります

61a66
><tr class="rowA">
    <td class="_1"><a href="#row=1223456" alt="Show details">1223456</a></td>
    <td class="_2"><span style="">1245361536363</span></td>
    <td class="_3"><a href="http://www.somesite.org/the/path/page.htm"><b>infooooooooo123</b></a></td>
    <td class="_4">July 21 1975</td>
</tr>

Django テンプレートから最終的にレンダリングされた行ごとの HTML として。この例では、204 バイトのデータ構造が 306 バイトの HTML ファイルになっています。テストによると、1,000 文字を超える文字が表示されるはずです。diff の結果を投稿していただければ、よりコンパクトにするためのアイデアを提供できるかもしれません。

于 2012-05-26T13:36:21.177 に答える