Мне нужно прочитать около 300 файлов, чтобы создать связь со следующим фрагментом кода. Учитывая связь, я должен прочитать их все в памяти.Повышение эффективности (памяти/времени) следующего кода python
with util.open_input_file(f) as f_in:
for l in f_in:
w = l.split(',')
dfm = dk.to_key((idx, i, int(w[0]), int(w[1]))) <-- guaranteed to be unique for each line in file.
cands = w[2].split(':')
for cand in cands:
tmp_data.setdefault(cand, []).append(dfm)
Тогда мне нужно выписать структуру данных выше, в следующем формате:
k1, v1:v2,v3....
k2, v2:v5,v6...
я использую следующий код:
# Sort/join values.
cand2dfm_data = {}
for k,v in tmp_data.items():
cand2dfm_data[k] = ':'.join(map(str, sorted(v, key=int)))
tmp_data = {}
# Write cand2dfm CSV file.
with util.open_output_file(cand2dfm_file) as f_out:
for k in sorted(cand2dfm_data.keys()):
f_out.write('%s,%s\n' % (k, cand2dfm_data[k]))
Так как я должен обрабатывать значительное количество файлы, я наблюдаю две проблемы:
Память, используемая для хранения tmp_data очень большая. В моем случае использования, обрабатывая 300 файлов, он использует 42 ГБ.
Списание файла CSV занимает много времени. Это потому, что я вызываю write() для каждого элемента() (около 2.2M). Кроме того, выходной поток использует компрессор gzip для экономии места на диске.
В моем используемом случае номера гарантированно будут 32-битными без знака.
Вопрос:
Чтобы добиться снижения памяти, я думаю, что это будет лучше использовать 32-битный Int для хранения данных. Должен ли я использовать ctypes.c_int() для хранения значений в dict() (сейчас они являются строками) или есть лучший способ?
Чтобы ускорить запись, следует ли писать объект StringIO, а затем выгружать его в файл или есть лучший способ?
В качестве альтернативы, может быть, есть лучший способ выполнить вышеуказанную логику, не читая все в памяти?
Если ваш код работает без ошибок, лучшим местом для запроса может быть [codereview.se]. – usr2564301