1

大きな (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 側のメモリもパージされる) かどうかを確認するのを待ちましたが、役に立ちませんでした。これは私のコード内のものですか、それともデータストアへのデータの追加に関連して変更できないものですか。何時間も何日も遊んだ後、私は立ち往生して混乱しています。

4

1 に答える 1