我正在尝试将一个大的(5GB)XML 文件(产品目录)解析到谷歌数据存储中。我遇到的问题是它占用了大量内存。通过逐行读取并删除元素,我能够从解析部分中获取内存。然而,有些东西仍然存在。
我的代码是http://pastebin.com/ESARQikC
我相信问题出现在这个特定的功能中
def process_element(self,item):
if item.tag == "programname":
self.Plist.append(item.text)
elif item.tag == 'name':
self.Plist.append(item.text)
elif item.tag == 'description':
self.Plist.append(item.text)
elif item.tag == 'sku':
self.Plist.append(item.text)
elif item.tag == 'manufacturer':
self.Plist.append(item.text)
elif item.tag == 'price':
self.Plist.append(item.text)
elif item.tag == 'buyurl':
self.Plist.append(item.text)
elif item.tag == 'imageurl':
self.Plist.append(item.text)
elif item.tag == 'advertisercategory':
self.Plist.append(item.text)
elif item.tag=="product":
Product(
programname=("%s" % self.Plist[0]),
name=("%s" % self.Plist[1]),
description=("%s" % self.Plist[2][0:500]),
sku=("%s" % self.Plist[3]),
manufacturer=("%s" % self.Plist[4]),
price=("%s" % self.Plist[5]),
buyurl=("%s" % self.Plist[6]),
imageurl=("%s" % self.getBigImageUrl(self.Plist[7])),
advertisercategory=("%s" % self.Plist[8])).put()
self.count+=1
print self.count
if self.count%15000 == 0:
time.sleep(10000)
for ob in self.Plist:
del ob
del self.Plist
self.Plist=[]
del item
当我注释掉 Product().put() 行并运行它时,它可以通过大量行而不会对内存产生太大影响。我在中间添加睡眠的原因是我在想 GAE 产生的一些子进程正在将数据添加到数据存储中,并且可能需要一些时间来操作。所以我在添加 15000 个项目后等待,看看是否会释放任何 ram(在操作系统端也清除内存),但它没有帮助。这是我的代码中的某些内容,还是与将数据添加到数据存储区相关的某些内容。在玩了几个小时/几天之后,我感到困惑和困惑。