1

我正在尝试将一个大的(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(在操作系统端也清除内存),但它没有帮助。这是我的代码中的某些内容,还是与将数据添加到数据存储区相关的某些内容。在玩了几个小时/几天之后,我感到困惑和困惑。

4

1 回答 1

1

您是否在开发服务器中运行此代码?开发服务器的数据存储耗尽内存存在一个已知问题:Why memory leaks when using DataStore API on dev server。原因是它使用内存映射来存储您的所有实体。

于 2013-07-30T17:11:45.127 回答