【发布时间】:2010-12-12 04:37:49
【问题描述】:
据说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
【问题讨论】:
-
第一个问题是:你有多少物理内存可用?可能只是因为 Python 认为它不值得清理,因为仍然有 1GB 的可用物理内存。
-
@Matthew,看起来只有 730MB 的 8GB RAM 可用。
-
尝试生成 15 个进程 - 这种方式消耗了多少内存?我猜得少得多,我猜真正的罪魁祸首是线程的东西(我写了一个非常简单的 TCP 回显服务器,使用多线程在 2 小时运行后占用 100% CPU - 用扭曲修复,从不费心研究线程缺乏表现)。
标签: python memory memory-management