Увеличение производительности чтения текстовых файлов

В нашем биоинформатическом приложении мы имеем большие файлы (до 900 МБ, обычно 100 МБ). Эти файлы содержат четкое текстовое представление генома и по существу представляют собой 1 строковый файл с последовательностью символов.

Данные привязаны по местоположению, например хромосома 7 начинается в позиции 1 и заканчивается в позиции 158937463. Обычно мы извлекаем небольшой участок около 400 символов, например: из положения 4 120 000 4 120 400.

У нас есть утилита, написанная на Ruby для этой цели: https://github.com/sfcarroll/bio-fasta-read, и она работает, читая файл с самого начала.

Мы читаем много раз, и они замедляют наше приложение. Мне было интересно, какие варианты доступны для кеширования? Исходные данные никогда не изменятся, но диапазоны будут часто меняться. Мы запускаем сервер Ubuntu 14 x64 на компьютере с 128 ГБ оперативной памяти.

Есть ли способ повышения производительности на уровне ОС? Возможно, загрузка всего файла в память или каким-то образом кэширование запросов?

РЕДАКТИРОВАТЬ

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

EDIT 2 Мы работаем на процессоре Xeon E5-1650 Hexa-Core и двух SSD (которые могут совершаться рейды), а также на 128 ГБ оперативной памяти.

2 Solutions collect form web for “Увеличение производительности чтения текстовых файлов”

Ядро Linux делает управление кэшем автоматически. Everthing, загружаемый в оперативную память, остается там до тех пор, пока другой процесс не будет нужен оперативной памяти, и больше нет. Таким образом, в ядре linux RAM всегда должно быть заполнено. В системе имеется 128 ГБ оперативной памяти, что более чем достаточно для файла 100-1000 МБ.

Чтобы загрузить огромный файл в ОЗУ, просто cat это:

 cat huge_file > /dev/null 2>&1 

Весь вывод отправляется в /dev/null , но для этого он должен передавать системную RAM. При этом вы можете посмотреть, как увеличивается /proc/meminfo in /proc/meminfo .

Когда cat закончится, выполните приложение Ruby. Теперь приложение Ruby считывает кешированную версию огромного файла.

Используйте dd чтобы прочитать раздел файла, не читая все предшествующие ему. Для вашего примера (чтение байтов 4 120 000 4 120 400) вы можете использовать

  dd bs = 400 skip = 10300 count = 1 if = your_input_file of = your_output_file 

Это определяет размер логического блока в 400 байт, а затем сообщает dd пропустить первые 10300 «логических блоков» входного файла ( if ). 10300 – 4 120 000 ÷ 400. Затем он считывает один блок ( count=1 ) из 400 байт и записывает его в выходной файл ( of ). Если вы опустите спецификацию, dd будет записывать на стандартный вывод, чтобы вы могли передать его чему-то.

Если начальная точка (смещение) не гарантируется как целое число, кратное размеру блока (или даже если оно есть), вы можете делать более сложные вещи, например

  (dd bs = 10000 skip = 412 count = 0; dd bs = 400 count = 1 of = your_output_file ) < ваш_input_file 

или

  (dd bs = 4120000 skip = 1 count = 0; dd bs = 400 count = 1 of = your_output_file ) < ваш_input_file 

где

  • Опять же, вы можете опустить спецификацию, и это будет записываться на стандартный вывод.
  • Если вы запустите dd без спецификации if , он будет считываться со стандартного ввода. Стандартный ввод для всей группы команд (dd …; dd …) происходит из < your_input_file в конце.
  • Первая команда dd не считывает и не записывает какие-либо данные из-за count=0 ; он только ищет.
  • Поскольку две команды dd получают свой стандартный ввод из одного и того же перенаправления ввода-вывода, поиск, сделанный первым, будет влиять на указатель файла, который видит второй.
  • Владелец каталога установлен на 518?
  • Как остановить работу в минуту cron?
  • Какой хороший текстовый редактор с поддержкой RTL (справа налево)?
  • прозрачность терминала, проблема с Imagemagick и X11
  • Невозможно включить TRIM на SSD
  • Безопасно ли перемещать разделы?
  • Как я могу связать poweroff с git push?
  • Переполнение / tmp смонтировано при наличии свободного места на /
  • Следующие версии LTS Ubuntu основаны на реальной тестовой версии Debian
  • WordPress high Steal время на Linux Ubuntu 16.04.1
  • Дублируйте источники в APT-файлах Ubuntu 14.10, они в порядке?
  • Linux и Unix - лучшая ОС в мире.