поиск общих строк в двух заданных входных файлах - PullRequest
1 голос
/ 31 января 2012

У меня есть два файла размером 20Gb каждый.Я должен искать общую строку среди них.Предположим, что максимальная длина строки составляет 20 байт.так что для решения этой проблемы я использую следующий алгоритм Я использую систему 8 ГБ ОЗУ с четырехъядерным процессором i3.

sort the files using any suitable sorting utility
open files A and B for reading
read wordA from A
read wordB from B
while (A not EOF and B not EOF)
{
    if (wordA < wordB)
        read wordA from A
    else if (wordA > wordB)
        read wordB from B
    else
        /* match found, store it into some other files */
        write wordA into output
        read wordA from A
}

она прошла успешно для вышеупомянутой конфигурации системы, НО, когда я запускаю этот алгоритм в системе6 ГБ ОЗУ и доступное дисковое пространство 120 ГБ с 6-ядерным процессором i3 ... моя система отключалась много раз.Почему это происходит?

Плз, скажите мне любой другой способ решить эту PLM!Можем ли мы улучшить его производительность?

1 Ответ

3 голосов
/ 31 января 2012

Да, вы можете значительно улучшить производительность, используя очень короткий awk 1-вкладыш

awk 'FNR==NR{a[$0]++;next}a[$0]' file1 file2

С помощью awk вы можете находить уникальные строки без предварительной их сортировки. Вы на самом деле не сказали, что хотите делать с общими линиями, поэтому я просто предположил, что вы хотите их распечатать.

Если вы хотите распечатать только общую строку один раз независимо от того, сколько раз она повторяется, вы можете использовать это:

awk 'FNR==NR{a[$0]=1;next}a[$0]-- > 0' file1 file2
...