объединить несколько файлов на основе первого столбца и сохранить проблемы с памятью

Отказ батареи DX. Я отнес компьютер в сервисный центр, потому что батарея продержалась в итоге 0 секунд. Итак, отказ батареи. Я думаю, что самым большим признаком этой вещи был тест с живым Linux и наблюдение, что батарея продержалась всего 7,5 мин за один раз, и, наконец, 0 секунд.

Все ушло в гарантию. Я думаю, что эти компьютеры со скидкой Amazon/... иногда имеют более высокий риск отказа батареи; было бы здорово получить какую-нибудь статистику об этом. Тем не менее, это имеет смысл. Если есть подозрение на дефект детали, то она быстро раскупается, а значит, снижается цена.

2
27.10.2016, 08:28
2 ответа

Вы пробовали awk ? Не уверен, что он будет обрабатывать большие файлы лучше, чем perl , но, возможно, стоит попробовать:

Внутри вашего сценария awk:

BEGIN {
    RS=">[0-9]+"
}

FNR==1{next}

NR==FNR {
    a[$1]++
    next
}


$1 in a {
    b[$1]++
    next
}

{
    c[$1]++
}

END {
    for (key in a) {
        if (b[key] == "") {
            printf key"\tfile1:"a[key]"\t\tcount:"a[key]"\n"
        } else {
            printf key"\tfile1:"a[key]"\tfile2:"b[key]"\tcount:"a[key]+b[key]"\n"
        }
    }
    for (key in c) {
        printf key"\t\tfile2:"c[key]"\tcount:"c[key]"\n"
    }
}

Для его запуска:

$ awk -f myscript.awk file1 file2 > output.txt

Протестировано с:

file1

>1
ATGCCGTT      file1:1
+
HHHHKKKK

>2
ATTCCAACg        file2:1
+
=#GJLMNB

файл2

>2
ATGCCGTT       file2:3
+
JJKHHTTT

>3
ATTCCAAC        file2:1
+
=#GJLMNB

Вывод в терминале:

ATTCCAACg   file1:1         count:1
ATGCCGTT    file1:1 file2:1 count:2
ATTCCAAC            file2:1 count:1
0
27.01.2020, 22:44

Добавьте эти мистические заклинания в свою программу

use DB_File;
my %seen; 
unlink '/tmp/translation.db';
sleep 2; 
tie ( %seen, 'DB_File', '/tmp/translation.db' )
    or die "Can't open /tmp/translation.db\n";

, и ваш хэш больше не будет находиться в памяти, а будет храниться в базе данных на диске. Вы можете оставить остальную часть кода как есть. Правда, я использовал модуль DB_File, но на самом деле причин не делать этого нет. Он поставляется с каждой установкой perl из коробки, поэтому вам не нужно его устанавливать или что-то еще.

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

0
27.01.2020, 22:44

Теги

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