【问题标题】:Python: Memory allocation errorPython:内存分配错误
【发布时间】:2011-12-21 05:59:35
【问题描述】:

我正在从 sqlite db 中读取行,遍历它们,然后使用每行中的变量作为生成图的函数的参数, 类似于下面的伪代码

conn=sqlite3.connect(db)
c=conn.cursor()
myrows=c.execute("select * from values WHERE var=1")
for burst in myrows:
    met=burst[1]
    make_plot(met)
c.close()    

经过一定时间后,会出现以下错误之一:

1) 请求了 86392 个项目,但只有 0 个读取分段错误

2) 无法分配 3072000 字节 中止

3) 分段错误

make_plot() 必须读取一个大文件 (~8 mB) 并对数据进行一些操作,并且 myrows 中有 ~500 个元素。从错误中我认为我的内存不足(?),但我还没有找到任何可以帮助我追踪/诊断这个问题的东西。关于我将如何做到这一点的任何想法?

【问题讨论】:

    标签: python memory segmentation-fault allocation


    【解决方案1】:

    如果您只关心第二个字段,您就不能像下面这样说吗?

    myrows=c.execute("select values.bust from values WHERE var=1")

    另外,我想知道您是否真的想为每一行创建图...您不想将所有数据绘制在一个图中吗?

    【讨论】:

    • 嗨,我选择的数据库中的每个条目都有自己的数据和必须制作的情节。我发布的代码是一个简化版本,仅包含步骤(即我删除了大部分变量)。干杯
    • 所以这个 make_plot() 会为每个调用和进程打开一个约 8MB 的文件,并结合myrows 中的记录?您知道错误来自 my_plot() 还是来自数据库中记录的循环?是否存在内存泄漏或非法访问内存的可能性?
    • 原来我使用的 pyfits 模块版本(2.4)有内存泄漏,我升级到 3.0 并且它改善了问题,即它在使用我所有的 ram 之前运行了更长的时间.事实证明,在我的绘图功能结束时我还缺少一个 plt.close(fig) - 弹出它并且一切正常。干杯
    • @user1027686:很高兴听到一切都开始了!
    【解决方案2】:

    尝试通过将您的 for 语句更改为:

    for burst in c.execute("select * from values WHERE var=1"):
        # your code here
    

    不是一次检索一个行,而是一次检索行。

    【讨论】:

      猜你喜欢
      • 2013-06-01
      • 2016-10-29
      • 2013-03-04
      • 1970-01-01
      • 2023-03-17
      • 2012-11-27
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多