Сортировка, слияние и удаление дубликатов в больших текстовых файлах на HPC?

Вопрос или проблема

Я ищу совет

В настоящее время я создаю базу данных kmer и собираюсь объединить/отсортировать и выделить уникальные строки из 47 файлов sample.txt.gz, которые имеют размер по 16 ГБ каждый. Какой будет самый быстрый способ это сделать.

Я сейчас запускаю это:

zcat *.merged.kmers.txt.gz | sort --parallel=48 --buffer-size= 1400G | uniq | gzip > all_unique_kmers.txt.gz

Я запускал это на slurm, но хотел бы узнать, какие параметры и что сделал бы кто-то другой, так как это работает уже 4 дня!!!!

47 образцов, 16 ГБ сжато, 80 ГБ распаковано,

объединение, сортировка, удаление дубликатов

пожалуйста, кто-нибудь, помогите мне…

Ответ или решение

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

Теория

При работе с большими текстовыми файлами на высокопроизводительных вычислительных системах (HPC) основные проблемы, с которыми сталкиваются, включают в себя:

  1. Использование ресурсоемких операций: Сортировка – одна из самых сложных в плане вычислительных ресурсов операций, особенно при больших объемах данных. Параллелизм и оптимизация использования памяти являются ключевыми факторами для ускорения этих процессов.

  2. Оптимизация ввода-вывода: Работа с файлами таких размеров потенциально ограничивается скоростью дисковода и пропускной способностью ввода-вывода. Это особенно актуально для операций сжатия и распаковки.

  3. Параллельная обработка: Большинство современных HPC-систем предоставляют возможности для параллелизации задач. Это может значительно сократить время выполнения, если операции правильно оптимизированы по числу ядер и объему требуемой оперативной памяти.

Пример

Предположим, что у нас есть задача объединения, сортировки и удаления дубликатов из множества больших файлов. При наличии ресурсов HPC, одной из возможностей оптимизации является четкая параллельная обработка. Например:

  • Разделение задач: Используйте split для разбивки больших файлов на меньшие части, которые могут быть более эффективно обработаны параллельно.

  • Параллельная сортировка: Используйте параллельные инструменты сортировки, такие как GNU Parallel, например, в комбинации с sort. Это позволяет распределять нагрузку на несколько ядер процессора.

  • Удаление дубликатов: Используйте функции uniq в GNU Core Utilities после сортировки данных, чтобы эффективно удалять дубликаты, так как uniq требует отсортированных данных.

Применение

Теперь применим наши теоретические знания и данный пример к вашему случаю:

  1. Разделите файлы: Используйте утилиту split для предварительной разделки исходных .gz файлов на меньшие блоки, если это возможно. Это позволит обработать части данных параллельно.

    for file in *.merged.kmers.txt.gz; do
       zcat "$file" | split -l 1000000 - "./${file%.txt.gz}_" --additional-suffix=.txt
    done
  2. Параллельная сортировка и удаление дубликатов: Используйте инструмент GNU Parallel для сортировки и обработки отсегментированных данных:

    find . -name '*.txt' | parallel -j 48 "sort --buffer-size=1400M -u {} | gzip > {}.gz"
  3. Объединение результатов: После выполнения параллельной сортировки и удаления дубликатов объедините результирующие файлы:

    gunzip -c *.txt.gz | sort --buffer-size=1400G -u | gzip > all_unique_kmers.txt.gz
  4. Оптимизация параметров slurm: Убедитесь, что ваши задания Slurm настроены на использование оптимального количества ядер и ограничений по памяти. Например:

    #SBATCH --nodes=1
    #SBATCH --ntasks=48
    #SBATCH --mem=150G

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

Оцените материал
Добавить комментарий

Капча загружается...