Вопрос или проблема
Я ищу совет
В настоящее время я создаю базу данных 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) основные проблемы, с которыми сталкиваются, включают в себя:
-
Использование ресурсоемких операций: Сортировка – одна из самых сложных в плане вычислительных ресурсов операций, особенно при больших объемах данных. Параллелизм и оптимизация использования памяти являются ключевыми факторами для ускорения этих процессов.
-
Оптимизация ввода-вывода: Работа с файлами таких размеров потенциально ограничивается скоростью дисковода и пропускной способностью ввода-вывода. Это особенно актуально для операций сжатия и распаковки.
-
Параллельная обработка: Большинство современных HPC-систем предоставляют возможности для параллелизации задач. Это может значительно сократить время выполнения, если операции правильно оптимизированы по числу ядер и объему требуемой оперативной памяти.
Пример
Предположим, что у нас есть задача объединения, сортировки и удаления дубликатов из множества больших файлов. При наличии ресурсов HPC, одной из возможностей оптимизации является четкая параллельная обработка. Например:
-
Разделение задач: Используйте
split
для разбивки больших файлов на меньшие части, которые могут быть более эффективно обработаны параллельно. -
Параллельная сортировка: Используйте параллельные инструменты сортировки, такие как GNU Parallel, например, в комбинации с
sort
. Это позволяет распределять нагрузку на несколько ядер процессора. -
Удаление дубликатов: Используйте функции
uniq
в GNU Core Utilities после сортировки данных, чтобы эффективно удалять дубликаты, так какuniq
требует отсортированных данных.
Применение
Теперь применим наши теоретические знания и данный пример к вашему случаю:
-
Разделите файлы: Используйте утилиту
split
для предварительной разделки исходных .gz файлов на меньшие блоки, если это возможно. Это позволит обработать части данных параллельно.for file in *.merged.kmers.txt.gz; do zcat "$file" | split -l 1000000 - "./${file%.txt.gz}_" --additional-suffix=.txt done
-
Параллельная сортировка и удаление дубликатов: Используйте инструмент GNU Parallel для сортировки и обработки отсегментированных данных:
find . -name '*.txt' | parallel -j 48 "sort --buffer-size=1400M -u {} | gzip > {}.gz"
-
Объединение результатов: После выполнения параллельной сортировки и удаления дубликатов объедините результирующие файлы:
gunzip -c *.txt.gz | sort --buffer-size=1400G -u | gzip > all_unique_kmers.txt.gz
-
Оптимизация параметров slurm: Убедитесь, что ваши задания Slurm настроены на использование оптимального количества ядер и ограничений по памяти. Например:
#SBATCH --nodes=1 #SBATCH --ntasks=48 #SBATCH --mem=150G
Эти изменения в процессе должны значительно снизить общее время обработки, не перегружая вашу систему. Не забывайте мониторить выполнение и корректировать параметры, чтобы найти оптимальный баланс между используемыми ресурсами и временем выполнения.