Что использовать, чтобы загрузить большой файл и соединить его с меньшим в Python? - PullRequest
0 голосов
/ 10 сентября 2018

У меня большой файл ~ 5 ТБ (> 2000 столбцов и 250 млн строк), и я хочу присоединить его к другому файлу, довольно маленькому ~ 10 ГБ (10 столбцов и 20 млн строк).

Это мой текущий подход в Python:

  1. Загрузка меньшего файла в память и установка индекса.
  2. Разделить файл большего размера на 250 частей, каждая из которых помещается в память.
  3. Загрузить часть k файла большего размера (k = 1, ..., 250) в память, установить индекс и объединить с помощьюменьший файл на основе поля идентификатора (который является индексом).
  4. Сохранение результатов на диск и загрузка другой части ...

Код:

import pandas as pd
small_file = pd.read_csv('small_file.txt', sep='|', header=None,
                     usecols=[0,1,2,3,4,5,6,7,8,9], dtype=column_types_small_file)
small_file.set_index(2, inplace=True)
large_file_part_k= pd.read_csv('large_file_part_k.txt', sep='|', header=None)
large_file_part_k.set_index(2, inplace=True)
merged = pd.merge(small_file, large_file_part_k, how="inner", left_index=True, right_index=True)
merged.to_csv('join_results.csv', mode='a', header=False)

Это работает :) Но обработка одной части занимает ~ 550 сек.,Зачем?Загрузка одной части в память занимает ~ 450 сек.:( Я пытался определить типы данных для всех столбцов при загрузке в память, но это усугубило ситуацию, например, в 3-4 раза дольше.

У вас есть другие варианты для этой конкретной ситуации? Машина, которую я используюимеет 120 ГБ памяти и 32 ядра.

1 Ответ

0 голосов
/ 10 сентября 2018

Я бы посоветовал конвертировать ваш файл в форматы файлов более эффективные, чем CSV.Например, вы можете рассмотреть форматы файлов HD5 и Feather , которые дадут вам импульс в операциях чтения / записи.См. Также this (закрыто) Stackoverflow вопрос.

...