У меня есть 2 огромных файла xml. Один - около 40 ГБ, другой - около 2 ГБ. Предположим, что формат XML является что-то вроде этогоpython mmap regex ищет общие записи в двух файлах
<xml>
...
<page>
<id> 123 </id>
<title> ABC </title>
<text> .....
.....
.....
</text>
</page>
...
</xml>
Я создал файл индекса для обоих файлов 1 и 2 файла с помощью ттар.
Каждый из файлов индекса соответствует этому формату:
Id <page>_byte_position </page>_byte_position
Таким образом, в основном дается идентификатор, из индексных файлов, я знаю, где тег начинается для этого Id и где заканчивается то есть тег байт поз.
Теперь, что мне нужно сделать, это: - мне нужно, чтобы иметь возможность выяснить для каждого идентификатора в меньшем индексного файла (для 2 Гб), если идентификатор существует в большем индексного файла - Если id существует, мне нужно получить _byte_pos и _byte_pos для этот идентификатор из более крупного файла индекса (для 40GB-файла)
Мой текущий код ужасно медленный. Я предполагаю, что я выполняю алгоритм O (m * n), предполагая, что m - это размер файла и файл меньшего размера n.
with open(smaller_idx_file, "r+b") as f_small_idx:
for line in f_small_idx.readlines():
split = line.split(" ")
with open(larger_idx_file, "r+b") as f_large_idx:
for line2 in f_large_idx.readlines():
split2 = line2.split(" ")
if split[0] in split2:
print split[0]
print split2[1] + " " + split2[2]
Это AWFULLY slow !!!!
Любые лучшие предложения?
В принципе, учитывая 2 огромных файла, как вы можете искать, если каждое слово в определенном столбце в меньшем файле существует в огромном файле, и если это так, вам нужно также извлечь другие соответствующие поля.
Любые предложения были бы очень признательны! :)
Как насчет отбрасывая этот подход mmap в пользу хранения обоих наборов данных в базе данных? Базы данных действительно хороши с такой проблемой. –