Я хотел бы пересечь серию небольших файлов с относительно большим файлом. Следуя многим темам о stackoverflow и после некоторых тестов, я решил использовать эту функцию, которая была самой быстрой на моих данных:
for file1 in ./myfiles*
do
# Do other things to create file1 and file2
# Then
grep -f $file1 file2.txt | awk -F '\t' '{print $1}' > myResults_$file1.txt
done
где file1 - это файл с одним столбцом от 50 до 100000 строк, а file2 - это файл с разделителями из двух столбцов, ~ 1 миллион строк.
Бывший:
file1
A
B
C
файл2
A 1
B 2
C 3
Я запускаю команду в кластере с 1 потоком и 48 ГБ ОЗУ. Однако я, как только он достигает file1 размером более 10000 строк, он вылетает со следующей ошибкой:
slurmstepd: Job 3312063 exceeded memory limit (50359784 > 50331648), being killed
Может кто-нибудь объяснить мне, почему эта команда хранит так много в памяти и как я могу решить эту проблему?
Вы уверены, что grep / awk запущены, когда достигнут предел памяти? Или это может быть какой-то другой код, который не показан?
В этом сценарии нет ничего очевидного, что могло бы вызвать проблемы с памятью. grep считывает каждый файл1 в память 1 за раз, но 100000 строк в один столбец не должны иметь большого значения. В остальном каждая строка обрабатывается по одной. Это будет медленно, но это компромисс для НЕ использования большого количества памяти.
Спасибо вам всем. По крайней мере, у меня есть подтверждение, что теоретически это не должно происходить отсюда. Я продолжу расследование.
Убедитесь, что у вас нет пустых строк в
file1
- они соответствуют всему. Проверить как это stackoverflow.com/a/13506134/2836621