大きな (5 GB) XML ファイル (製品カタログ) を Google データストアに解析しようとしています。私が抱えている問題は、多くのメモリを占有することです。行ごとに読み取り、要素を削除することで、解析部分からメモリを減らすことができました。しかし、まだ何かが遅れています。
私のコードは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 が解放される (OS 側のメモリもパージされる) かどうかを確認するのを待ちましたが、役に立ちませんでした。これは私のコード内のものですか、それともデータストアへのデータの追加に関連して変更できないものですか。何時間も何日も遊んだ後、私は立ち往生して混乱しています。