Как я могу предотвратить замедление работы системы повторяющимися операциями malloc до того, как программа будет уничтожена с помощью SIGKILL?

sed 'N;N;N;/\n\n/d' file.fastq >new-file.fastq

Это считывает четыре строки записи FastQ, а затем проверяет, содержит ли она два последовательных символа новой строки. Если это так, вся запись игнорируется. Если это не так, он печатается. Это будет повторяться для всех записей в файле. Все напечатанные записи идут в новый файл (здесь new-file.fastq).

Скрипт sedс аннотациями:

         # (implicit: read a line)
N;       # read a second line, append it to the pattern space with embedded \n in-between
N;       # read a third line
N;       # read a fourth line
/\n\n/d  # if there are two consecutive newlines, delete and continue from top
         # (implicit: print)

Комментарий коллеги:

Fastq records are often paired, and software tends to throw a fit when pair mates are not found without explicitly telling it mates are missing. Several tools have a minimum length option like trimmomatic that will keep pairing, and separate orphaned records.

Это означает, что если чтения в вашем файле являются парными, и одна из пар пуста, вы испортите пару, просто удалив пустую запись.

Удаление сопряжения пустого чтения было бы намного сложнее, если бы не использовались уже существующие инструменты биоинформатики. С инструментами из стандартного набора инструментов Unix это, вероятно, будет включать сохранение пустых операций чтения в отдельный файл, а затем, используя их заголовки FastQ, сканирование и удаление соответствующих сопряжений.

Однако данные, показанные в вопросе, представляют собой только непарные чтения.

1
25.04.2020, 20:29
2 ответа

According to the man page of malloc(), if there is no memory available then malloc simply returns 0.

Так указано, и в этом случае ваш код завершится. Но, кажется, упреждает.

В Linux есть убийца OOM (Out of Memory ), который идентифицирует мошеннические процессы, уничтожает их и регистрирует их действия. Но старается не спешить в своих казнях.

Известно, что вежливые приложения спрашивают систему о ее конфигурации и соответствующим образом адаптируют свое поведение. Очевидно, cmake не является одним из них.

0
19.03.2021, 02:26

Похоже, ваша система начинает переключаться на диск, когда ей не хватает оперативной памяти. Это замедляет работу, поскольку диски на несколько порядков медленнее оперативной памяти. В какой-то момент виртуальная память также исчерпывается, и срабатывает Out of Memory Killer в Linux, выбирает процесс, который, по его мнению, является грубым, и убивает его (, это SIGKILL, который вы видите ). Это гарантирует, что система останется пригодной для использования.

Чтобы предотвратить это, вы можете ограничить объем оперативной памяти, доступной процессу. Например. ограничить объем памяти, доступной для CMake, до 100 МБ:

ulimit -v 100000
cmake <args>

Обратите внимание, что вы можете установить отдельные ограничения для ОЗУ (-m )и виртуальной памяти (-v ). Обратите внимание, что если память недоступна, malloc()вернет нулевой указатель. Что ж, -написанное программное обеспечение должно разумно справляться с этим, в то время как другое программное обеспечение может умереть из-за ошибки сегментации, когда de -ссылается на нулевой указатель.

0
19.03.2021, 02:26

Теги

Похожие вопросы