В моей программе используется два больших текстовых файла (Миллионы строк). Эти файлы анализируются и загружаются в хэши, чтобы можно было быстро получить доступ к данным. Проблема, с которой я сталкиваюсь, заключается в том, что в настоящее время синтаксический анализ и загрузка являются самой медленной частью программы. Ниже приведен код, где это делается.Увеличение скорости загрузки больших файлов
database = extractDatabase(@type).chomp("fasta") + "yml"
revDatabase = extractDatabase(@type + "-r").chomp("fasta.reverse") + "yml"
@proteins = Hash.new
@decoyProteins = Hash.new
File.open(database, "r").each_line do |line|
parts = line.split(": ")
@proteins[parts[0]] = parts[1]
end
File.open(revDatabase, "r").each_line do |line|
parts = line.split(": ")
@decoyProteins[parts[0]] = parts[1]
end
И файлы выглядят как пример ниже. Он начинался как файл YAML, но формат был изменен для увеличения скорости разбора.
MTMDK: P31946 Q14624 Q14624-2 B5BU24 B7ZKJ8 B7Z545 Q4VY19 B2RMS9 B7Z544 Q4VY20
MTMDKSELVQK: P31946 B5BU24 Q4VY19 Q4VY20
....
Я возился с различными способами создания файла и анализа их, и до сих пор это самый быстрый способ, но это все еще очень медленно.
Есть ли способ улучшить скорость этого, или есть целый другой подход, который я могу принять?
Список вещей, которые не работают:
- YAML.
- Стандартные рубиновые нити.
- Снятие процессов, а затем извлечение хеша через трубу.
Как насчет написания расширения C? – CodeJoust
Вы используете Ruby 1.8 или 1.9? 1.9 может быть на 10-20% быстрее, чем 1,8 (для окон такого типа это еще больше). – Digikata
Я использую 1.9.1 –