【问题标题】:More than 3 mb of data for list of list for 1500 records [closed]1500 条记录的列表列表的数据超过 3 mb [关闭]
【发布时间】:2012-06-01 17:57:00
【问题描述】:

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

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

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

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

有人可以帮我解决问题吗?python 列表和对象真的那么重吗?

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

【问题讨论】:

  • 而且我们应该在没有看到任何代码的情况下找出问题......如何?帮我们一个忙,并发布一些示例 - 现在这就像走到车库并向机械师抱怨你的车很慢,他应该立即修理它。
  • :) 我告诉你问题是一个列表的成本超过一个 kb,这很常见吗?我不认为代码有什么问题。
  • 你只是说字符串和日期对象。一串多长?字符串可以是单个字符,也可以是 TB。
  • 字符串长度最多为 15 个字符:/
  • 您以哪种格式发送数据?如果您发布示例记录及其生成日期也可能会有所帮助。

标签: python django performance object firebug


【解决方案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 文件。根据您的测试,您应该会看到超过一千个字符。如果您发布您的差异结果,也许我们可以为您提供一些使其更紧凑的想法。

【讨论】:

  • 感谢您的评论...我正在通过 django 渲染为 HTML,我只发送列表中的必填字段。但是,当我们按照您的建议进行操作时,我们仅获得列表容器 na 的大小,那么内部数据(如字符串和日期对象)呢?我们不能像这样测量它们吗?
  • 在控制台上,即使我得到了一个小数字,但是当它在 html 页面上呈现时,它有 1kb 的大小,我想知道发生了什么,我不知道该看什么以及在哪里看。有什么建议?检查每条记录的大小我所做的是 -> 将单个列表呈现为 html 并检查整个页面的大小,结果约为 42 kb+(一些 js 文件等常量,所以我们可以忽略这个常量) 然后我将 2 条记录渲染到 html 页面,结果显示为 43+ kb,所以在采样后有点像这样......我确认记录的大小约为 1kb
  • @turtle s: 那么“一条记录”在渲染成 HTML 时是什么样子的呢?你是在添加一堆javascript onmouseover 属性还是什么?
  • 感谢您对这个问题的惊人看法,我从来没有想过这样的事情也很重要,您能否解释一下您的观点背后的概念作为回复?这将非常有帮助,因为我还不知道你的观点背后的概念
  • 哇@Hugh Bothwell,这是一个非常好的建议,我会按照你的建议做,我会朝这个方向进行更多调查,我会更新你,然后也许我们会理解这个问题多一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多