2013-05-13 4 views
1

У меня есть 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 огромных файла, как вы можете искать, если каждое слово в определенном столбце в меньшем файле существует в огромном файле, и если это так, вам нужно также извлечь другие соответствующие поля.

Любые предложения были бы очень признательны! :)

+0

Как насчет отбрасывая этот подход mmap в пользу хранения обоих наборов данных в базе данных? Базы данных действительно хороши с такой проблемой. –

ответ

2

У вас нет времени для сложного ответа прямо сейчас, но это должно работать (при условии временного Dict впишется в памяти):

  1. перебирать файл меньшего размера и поставить все слова соответствующего столбец в dict (поиск в дикторе имеет среднюю производительность в случае O (1))
  2. Итерируйте более крупный файл и найдите каждое слово в dict, сохраняя соответствующую информацию либо непосредственно с помощью записей dict, либо в другом месте.

Если это не работает, я хотел бы предложить сортировки (или фильтрации) файлы первым, так что куски могут быть обработаны независимо друг от друга (т.е. сравнивать только все, что начинается с А, то Б ...)

Смежные вопросы