2016-12-19 8 views
0

私はPythonの初心者です。 2つのファイルから2つのdictをロードすると、メモリエラーが発生します。これらの2つのファイルがPythonで2 dictを読み込む方法は?

with open(filename, 'rb') as f: 
    hashtable_album = {} 
    for line in f: 
    # print i 
    p = 0 
    q = line.find("####") 
    # print p 
    # print q 
    itembuf = line[p:q] 
    # print itembuf 
    dictbuf = line[q + 4:-1] 
    # print line 
    a = json.loads(dictbuf) 
    # print a 
    # print type(a) 
    hashtable_album[itembuf] = a 
f.close() 
with open(filename2, 'rb') as f2: 
    hashtable_item={} 
    i=0 
    for line in f: 
    print len(dic) 
    print i 
    #print line 
    p = 0 
    q = line.find("####") 
    # print p 
    # print q 
    itembuf = line[p:q] 
    # print itembuf 
    dictbuf = line[q + 4:-1] 
    # print line 
    a = json.loads(dictbuf) 
    #print a 
    # print type(a) 
    hashtable_item[itembuf] = a 
    i=i+1 
f2.close() 

ある最初のファイルは400メガバイト程度であり、それは200メガバイト程度である第二1、次に大きい、と私は私がメモリエラーを得た第二のファイルをロードするとき、私は最初のファイルsuccessfully.Butを読み込むことができます

Traceback (most recent call last): 
    File "E:/py_workspace/1.0_memory_error.py", line 44, in <module> 
    hashtable_item[itembuf] = a 
    MemoryError 

として私が最初に読んFILE2としてファイルをロードするとフォローFILE1順序を変更した場合、私は第二のファイルをロードするとき、メモリエラーもあります。 私は

hashtable_album = {} 

としてfile1をロードし、ロードFILE2に行くの後、私は辞書をクリアするように、メモリエラーが辞書から来ていると思います。そして今度はメモリエラーなしで動作します。 しかし、私はこれらの2つの辞書を同時に使用する必要があります。では、どうすれば一緒に読み込むことができますか?

ヒント:dictを保存するためにcPickleを試しましたが、作業はできません。また、メモリエラーも発生します。

+0

**同じスクリプト**のデータコンテナとコンパレータは、非常に悪い考えです!あなたにとって重要なデータはどこか保存しますが、なぜデータベースシステムを使用しないのですか?直接IOは常にエラーを発生させます(ハードウェアパフォーマンスのバグがあります)。このコードを「仮想OS」で実行しましたか? – dsgdfg

答えて

0

あなたはおそらく32ビットのPythonを実行しています。

あなたは離れて32ビット空間で実行してから行うことができない場合

$ python -c "import sys; print sys.maxint" // 64-bit python 
9223372036854775807 

$ python-32 -c "import sys; print sys.maxint" // 32-bit 
2147483647 

によって、あなたは二つのオプション

  1. を持っていることを確認してくださいは、Cを学び、そしてよりC.で処理を行いますファイルのサイズを入力すると、メモリ(mallocs/calloc)を厳密に使用するとmemのすべてを保持できる可能性があります。
  2. map-reduceを許可するアルゴリズムでmap-reduceを学び、各ステップで部分的なファイル処理を行い、最後のステップで結果を結合する方が早いでしょう。
  3. わかりませんが、Cythonを試してみてください。
+0

アドバイスをいただきありがとうございます、私はこれらを試してみましょう。 – Wenson

+0

私は32ビットのpythonを削除し、64ビットのpythonを変更し、私は私のpythonファイルをリロードします。それはメモリエラーなしで動作します!どうもありがとうございます ! @Ajeet – Wenson

+0

あなたは大歓迎です。 :)答え@Wensonを受け入れることを忘れないでください。そうすれば他の人はそれが働いたことを知るでしょう –

関連する問題