Saya memiliki 3 file besar, masing-masing berisi konten serupa, tetapi tidak sama. Bagian pertama adalah token, dan bagian kedua adalah kamus yang memiliki integer untuk ID dokumen, serta kejadian yang dimilikinya untuk dokumen tertentu. Masalah saya adalah, saya tidak dapat menyimpan semuanya ke dalam memori, dan saya perlu membuang ke file beberapa kali karena data sangat besar. Sebagai contoh:

File1:

token1;{"1": 5, "2": 5, "4": 5}
token2;{"2": 3, "3": 4}
token3;{"1": 4, "5": 1, "6": 6}

File2:

token4;{"7": 2, "9": 1, "12": 2}
token5;{"8": 3, "11": 1, "12": 2}
token2;{"9": 2, "12": 2}

File3:

token1;{"13": 1, "14": 2}
token6;{"14": 1, "16": 2, "17": 1}
token7;{"14": 1, "17": 2, "18": 1, "19", 3}

Konten akhir yang ingin saya miliki dalam file terakhir:

token1;{"1": 5, "2": 5, "4": 5, "13": 1, "14": 2}
token2;{"2": 3, "3": 4, "9": 2, "12": 2}
token3;{"1": 4, "5": 1, "6": 6}
token4;{"7": 2, "9": 1, "12": 2}
token5;{"8": 3, "11": 1, "12": 2}
token6;{"14": 1, "16": 2, "17": 1}
token7;{"14": 1, "17": 2, "18": 1, "19", 3}

Token duplikat yang ingin saya perbarui, serta menambahkan semua token baru ke satu file tunggal. Saya tidak dapat memuat semuanya ke dalam memori, tetapi saya dapat melewati setiap baris 1 oleh 1 bahkan jika itu membutuhkan waktu yang sangat lama. (efisiensi waktu ini bukan prioritas tertinggi). Setiap panduan di arah yang benar sangat dihargai! Terima kasih :) P.S. Saya menulis ini di Python

0
Oscar Lopez 28 Mei 2021, 23:52

1 menjawab

Jawaban Terbaik

Saya butuh istirahat jadi ...

from io import StringIO
import json

data = [
    '''\
token1;{"1": 5, "2": 5, "4": 5}
token2;{"2": 3, "3": 4}
token3;{"1": 4, "5": 1, "6": 6}
''',
    '''\
token4;{"7": 2, "9": 1, "12": 2}
token5;{"8": 3, "11": 1, "12": 2}
token2;{"9": 2, "12": 2}
''',
    '''\
token1;{"13": 1, "14": 2}
token6;{"14": 1, "16": 2, "17": 1}
token7;{"14": 1, "17": 2, "18": 1, "19": 3}
''',
]

out = {}
for text in data:
    f = StringIO(text)
    for line in f:
        key, s = line.split(';', 1)
        d = json.loads(s)
        out.setdefault(key, {}).update(d)

for key in sorted(out, key=lambda t: int(t[5:])):
    s = json.dumps(out[key])
    print(f"{key};{s}")

Ganti data dan instance StringIO() dengan objek file Anda.

1
Justin Ezequiel 28 Mei 2021, 22:09