python - 如何编写内存高效的 Python 程序?

标签 python memory memory-management

据说Python会自动管理内存。我很困惑,因为我有一个 Python 程序一直使用超过 2GB 的内存。

这是一个简单的多线程二进制数据下载器和解包器。

def GetData(url):
    req = urllib2.Request(url)
    response = urllib2.urlopen(req)
    data = response.read() // data size is about 15MB
    response.close()
    count = struct.unpack("!I", data[:4])
    for i in range(0, count):
        UNPACK FIXED LENGTH OF BINARY DATA HERE
        yield (field1, field2, field3)

class MyThread(threading.Thread):
    def __init__(self, total, daterange, tickers):
        threading.Thread.__init__(self)

    def stop(self):
        self._Thread__stop()

    def run(self):
        GET URL FOR EACH REQUEST
        data = []
        items = GetData(url)
        for item in items:
            data.append(';'.join(item))
        f = open(filename, 'w')
        f.write(os.linesep.join(data))
        f.close()

有 15 个线程正在运行。每个请求获取 15MB 的数据并将其解压缩并保存到本地文本文件。这个程序怎么会消耗超过 2GB 的内存?在这种情况下我需要做任何内存回收工作吗?如何查看每个对象或函数使用了多少内存?

如果您就如何让 python 程序以内存高效模式运行,我将不胜感激。

编辑:这是“cat/proc/meminfo”的输出

MemTotal:        7975216 kB
MemFree:          732368 kB
Buffers:           38032 kB
Cached:          4365664 kB
SwapCached:        14016 kB
Active:          2182264 kB
Inactive:        4836612 kB

最佳答案

正如其他人所说,您至少需要以下两项更改:

  1. 不要用 range

    创建一个巨大的整数列表
    # use xrange
    for i in xrange(0, count):
        # UNPACK FIXED LENGTH OF BINARY DATA HERE
        yield (field1, field2, field3)
    
  2. 不要创建一个巨大的字符串作为要一次写入的完整文件体

    # use writelines
    f = open(filename, 'w')
    f.writelines((datum + os.linesep) for datum in data)
    f.close()
    

更好的是,您可以将文件写为:

    items = GetData(url)
    f = open(filename, 'w')
    for item in items:
        f.write(';'.join(item) + os.linesep)
    f.close()

关于python - 如何编写内存高效的 Python 程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1659659/

相关文章:

python - 在 Eclipse 中设置 Python 解释器

python - 使用 selenium 和 python 从 DOM 中查找第二个元素

Go 内存分配——新对象、指针和逃逸分析

c - 如何在 C 中释放这个结构?

C 中的连续内存分配和内存访问延迟

c++ - 在线编译器对计算机内存的影响

python - 在导入的模块中使用外部类方法

python - 使用 Outlook 2016 通过 Python 发送电子邮件而无需打开它

c++ - 存储分配器 - 它是什么?

python - Python2 字典中的非单调内存消耗