次のようなPython辞書を含む約10個の巨大なファイルがあります。
dict1:
{
'PRO-HIS-MET': {
'A': ([1,2,3],[4,5,6],[7,8,9]),
'B': ([5,2],[6],[8,9]),
'C': ([3],[4],[7,8])},
'TRP-MET-GLN': {
'F': ([-5,-4,1123],[-7,-11,2],[-636,-405])}
}
dict2:
{
'PRO-HIS-MET': {
'J': ([-657], [7,-20,3], [-8,-85,15])}
'TRP-MET-GLN':{
'K': ([1,2,3],[4,50,6],[7,80,9]),
'L': ([5,20],[60,80],[8,9])}
}
基本的にそれらはすべて辞書の辞書です。各ファイルのサイズは約 1 GB です (上記はデータの一例です)。とにかく、私がやりたいことは、10 個の辞書を結合することです。
final:
{
'PRO-HIS-MET': {
'A': ([1,2,3],[4,5,6],[7,8,9]),
'B': ([5,2],[6],[8,9]),
'C': ([3],[4],[7,8])
'J': ([-657], [7,-20,3], [-8,-85,15])},
'TRP-MET-GLN': {
'F': ([-5,-4,1123],[-7,-11,2],[-636,-405])
'K': ([1,2,3],[4,50,6],[7,80,9]),
'L': ([5,20],[60,80],[8,9])}
}
小さなファイルで次のコードを試してみましたが、正常に動作します。
import csv
import collections
d1 = {}
d2 = {}
final = collections.defaultdict(dict)
for key, val in csv.reader(open('filehere.txt')):
d1[key] = eval(val)
for key, val in csv.reader(open('filehere2.txt')):
d2[key] = eval(val)
for key in d1:
final[key].update(d1[key])
for key in d2:
final[key].update(d2[key])
out = csv.writer(open('out.txt', 'w'))
for k, v in final.items():
out.writerow([k, v])
ただし、1 GB のファイルでそれを試みると、d1 と d2 および最終的な辞書をメモリに保持することで、すぐにメモリ不足になります。
私にはいくつかのアイデアがあります:
- セグメント化された辞書からキーをロードしてそれらを比較し、複数の辞書で同じものが見つかった場合は値を結合する方法はありますか?
辞書を 1 つの巨大なファイルにマージする代わりに (これはおそらく将来メモリの頭痛の種になるでしょう)、データをマージした後に 1 つのキーのすべての値を含む多くの個別のファイルを作成するにはどうすればよいでしょうか? たとえば、上記のデータの場合、次のようになります。
pro-his-met.txt: 'PRO-HIS-MET': { 'A': ([1,2,3],[4,5,6],[7,8,9]), 'B': ([5,2],[6],[8,9]), 'C': ([3],[4],[7,8]) 'J': ([-657], [7,-20,3], [-8,-85,15])} trp-met-gln.txt: 'TRP-MET-GLN': { 'F': ([-5,-4,1123],[-7,-11,2],[-636,-405]) 'K': ([1,2,3],[4,50,6],[7,80,9]), 'L': ([5,20],[60,80],[8,9])}
私は生物学者としてのプログラミング経験があまりありません (上記のデータはバイオインフォマティクスの問題を表していると推測したかもしれません)。