1500条记录的列表列表超过3 MB的数据

时间:2012-05-26 13:02:32

标签: python django performance object firebug

在向HTML发送一些记录列表时,我发现我的页面只有1500条记录非常慢。经过调查,我发现只有1500条记录传递了大量数据,大小在3到4 MB之间。 每行有6个值,都是字符串,其中两个是日期时间对象。

我环顾四周,发现字典很重,将字典更改为数据元组确实减少了另一页的负载。 但是在我的第一页中,我发送的是千条记录的列表,因此它是一个列表清单。

我尝试通过firebug查看为每条记录发送了多少数据,我发现每条记录的数据超过1 kb。

这是一个性能问题,因为我的应用程序是一个Web应用程序,所有数据都已被压缩。

任何人都可以帮我解决出错的问题吗?python列表和对象真的很重吗?

请告知是否有任何方法可以进一步检查。

1 个答案:

答案 0 :(得分: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:您应该运行diff(使用一条记录呈现的页面)与(使用两条记录呈现的页面);这应该准确地向您显示添加一条记录的页面结果。您的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文件。根据你的测试,你应该看到超过一千个字符。如果您发布差异结果,也许我们可以为您提供一些使其更紧凑的想法。