Описание проблемы, с которой я сталкиваюсь, немного сложнее, и я буду ошибаться на стороне предоставления более полной информации. Для нетерпеливого, здесь кратчайший способ я могу резюмировать:Эффективные методы буферизации и сканирования файлов для больших файлов в python
Что самое быстрое (наималейшее выполнения времени) способ разделить текстовый файл на ALL (перекрытие) подстрок размера N (связанно N , например 36) , выкидывая символы новой строки.
Я пишу модуль, который анализирует файлы в формате генома на основе ФАСИ. Эти файлы содержат так называемый человеческий справочный геном 'hg18', который вы можете скачать с UCSC genome browser (поймите пули!), Если хотите.
Как вы заметили, файлы генома состоят из chr [1..22] .fa и chr [XY] .fa, а также набор других небольших файлов, которые не используются в этом модуле.
Несколько модулей уже существуют для разбора файлов FASTA, таких как SeqIO BioPython. (К сожалению, я бы опубликовал ссылку, но пока у меня нет таких моментов). К сожалению, каждый модуль, который я смог найти, не выполняет определенную операцию, которую я пытаюсь сделать.
Моему модулю необходимо разделить данные генома (например, CAGTACGTCAGACTATACGGAGCTA) может быть строкой для каждой перекрывающейся подстроки N-длины. Позвольте мне привести пример, используя очень маленький файл (фактические хромосомные файлы между 355 и 20 миллионов символов) и N = 8
>>>import cStringIO >>>example_file = cStringIO.StringIO("""\ >header CAGTcag TFgcACF """) >>>for read in parse(example_file): ... print read ... CAGTCAGTF AGTCAGTFG GTCAGTFGC TCAGTFGCA CAGTFGCAC AGTFGCACF
функция, которую я нашел имел абсолютную максимальную производительность методов I Could думать так:
def parse(file):
size = 8 # of course in my code this is a function argument
file.readline() # skip past the header
buffer = ''
for line in file:
buffer += line.rstrip().upper()
while len(buffer) >= size:
yield buffer[:size]
buffer = buffer[1:]
Это работает, но, к сожалению, до сих пор занимает около 1,5 часов (смотрите примечание ниже) для анализа генома человека таким образом. Возможно, это самое лучшее, что я увижу с помощью этого метода (полный рефакторинг кода может быть в порядке, но я бы хотел его избежать, поскольку этот подход имеет некоторые особые преимущества в других областях кода), но я подумал, что я передам это сообществу.
Спасибо!
- Примечание. На этот раз включает в себя множество дополнительных вычислений, таких как вычисление противовесной строки и выполнение поиска хеш-таблиц на хеше размером примерно 5G.
пост-ответ вывод: Оказывается, что с помощью fileobj.read(), а затем манипулировать результирующую строку (string.replace() и т.д.) занимает относительно немного времени и памяти по сравнению с остальной частью программы, и поэтому я использовал этот подход. Всем спасибо!
Os.read, похоже, не имеет существенного отличия (результаты в моем ответе). –
Спасибо за ответ. Я рассматриваю рефакторинг проблемы для подхода с уменьшением карты, но я должен признать, что мой нерешительность проистекает из того, что он не видел алгоритм в действии и, таким образом, немного наивен. Не могли бы вы порекомендовать мне какую-нибудь конкретную литературу? – eblume
Я тоже добавлю это - я на самом деле уже распараллеливаюсь в очень высокой степени, что показывает значительные преимущества IO. После того, как я задал этот вопрос, я начинаю подозревать, что моя проблема на самом деле не IO вообще, а преобразования, которые я делаю в этом IO. – eblume