gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-28 23:33:45 24 4
gpt4 key购买 nike

据说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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com