据说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
最佳答案
正如其他人所说,您至少需要以下两项更改:
不要用
创建一个巨大的整数列表range
# use xrange for i in xrange(0, count): # UNPACK FIXED LENGTH OF BINARY DATA HERE yield (field1, field2, field3)
不要创建一个巨大的字符串作为要一次写入的完整文件体
# 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/