Быстрый способ объединения огромных файлов (> = 7 ГБ) в один - PullRequest
5 голосов
/ 09 января 2012

У меня три огромных файла, всего 2 столбца, и мне нужны оба. Я хочу объединить их в один файл, который затем можно записать в базу данных SQLite.

Я использовал Python и выполнил свою работу, но это заняло> 30 минут, а также повесил мою систему на 10 из них. Мне было интересно, если есть более быстрый способ с помощью awk или любого другого unix-инструмента. Более быстрый путь в Python тоже был бы великолепен. Код написан ниже:

'''We have tweets of three months in 3 different files.
Combine them to a single file '''
import sys, os
data1 = open(sys.argv[1], 'r')
data2 = open(sys.argv[2], 'r')
data3 = open(sys.argv[3], 'r')
data4 = open(sys.argv[4], 'w')
for line in data1:
    data4.write(line)
data1.close()
for line in data2:
    data4.write(line)
data2.close()
for line in data3:
    data4.write(line)
data3.close()
data4.close()

Ответы [ 3 ]

13 голосов
/ 09 января 2012

Стандартный способ объединения файлов в Unix - cat.Возможно, он не будет намного быстрее, но будет быстрее.

cat file1 file2 file3 > bigfile

Вместо того, чтобы создавать временный файл, вы можете cat напрямую преобразовать в sqlite

* 1009.*

В python вы, вероятно, получите лучшую производительность, если будете копировать файл не по строкам, а по блокам.Используйте file.read(65536) для чтения 64 Кбайт данных за раз, вместо того, чтобы перебирать файлы с for

2 голосов
/ 09 января 2012

В UNIX-подобных системах:

cat file1 file2 file3 > file4
1 голос
/ 09 января 2012

Я предполагаю, что вам нужно повторить этот процесс, и скорость является критическим фактором.

Попробуйте открыть файлы как двоичные файлы и поэкспериментируйте с размером блока, который вы читаете. Попробуйте 4096 и 8192 байта, так как они являются общими базовыми размерами буфера.

Есть похожий вопрос: Возможно ли ускорить ввод-вывод Python? , что также может представлять интерес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...