Строковое сравнение больших текстовых файлов с python - PullRequest
0 голосов
/ 29 марта 2011

Я работаю над некоторыми большими (несколько миллионов строк) наборами данных биоинформатики в общем формате:

chromosomeNumber locusStart locusStop sequence moreData

У меня есть другие файлы в этом формате:

chromosomeNumber locusStart locusStop moreData

Что янеобходимо иметь возможность считывать по одному файлу каждого типа в память, и если locusStart строки верхнего файла находится между началом и остановкой любой из строк нижнего файла, выведите строку в выходной файл 1.Если locusStart этой строки не находится между началом и концом каких-либо строк в нижнем файле, распечатайте его в выходной файл 2.

В настоящее время я читаю файлы в них, преобразовывая их в словари, на которых написанохромосома с соответствующими линиями в качестве значений.Затем я разделяю каждую строку значения на строку, а затем делаю сравнения со строками.Это занимает невероятно много времени, и я хотел бы знать, есть ли более эффективный способ сделать это.

Спасибо.

Ответы [ 3 ]

0 голосов
/ 29 марта 2011

Похоже, вы будете делать намного больше или меньше, чем сравнения, поэтому я не думаю, что загрузка ваших данных в словари вообще увеличит скорость кода - в зависимости от того, что выЯ объяснил, что звучит так, будто вы все еще просматриваете каждый элемент в одном или другом файле.

Вам нужна другая структура данных для загрузки данных и выполнения операций сравнения.Посмотрите на модуль Python bisect , я думаю, он может предоставить структуру данных, необходимую для более эффективного выполнения операций сравнения намного .


Если вы сможете более точно описать, чего именно вы пытаетесь достичь, мы сможем помочь вам начать писать код.

0 голосов
/ 29 марта 2011

Использование словаря с номером хромосомы - хорошая идея, если вы можете поместить оба файла в память.

Затем вы хотите отсортировать оба списка по locusStart (разделить строку, преобразовать locusStart вчисло - см. инструкции по сортировке , если вы не знаете, как сортировать только по locusStart).

Теперь вы можете просто просматривать свои списки: если нижний locusStart меньше первоговерхний locusStart, поместите строку в файл 2 и перейдите к следующему.Если нижний locusStart больше первого верхнего locusStart, то

  • Хотя он также больше, чем locusEnd, выбросить начало верхнего списка
  • Если вы обнаружите случай, когда онбольше чем locusStart и меньше чем locusEnd, поместите его в файл 1
  • В противном случае поместите его в файл 2

Это должно заменить то, что сейчас, вероятно, O(n^2) алгоритм, на O(n log n) один.

0 голосов
/ 29 марта 2011

Похоже, что для нижнего файла (который, как я предполагаю, имеет второй формат), единственное поле, которое вас беспокоит, это 'locusStart'.Поскольку из вашего описания вам не обязательно заботиться о других данных, вы можете сделать набор всех locusStart:

locusStart_list = set()
with open(upper_file, 'r') as f:
  for line in f:
    tmp_list = line.strip().split()
    locusStart_list.add(tmp_list[1])

Это удалит все ненужные манипуляции со строками, которые вы делаете для нижнего файла.,Затем вы можете легко сравнить locusStart поля с набором, созданным из нижнего файла.Набор также удалит дубликаты, что сделает его немного быстрее, чем использование списка.

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