2015-12-23 3 views
1

У меня огромное количество файлов, около 200 000 записей в файле. Я тестировал некоторые случаи, когда мне нужно выяснить, что шаблон именования файлов соответствует некоторым конкретным строкам. Вот как я предшествовал:Вложенная петля слишком медленная: обход записи 1MN

Тестовые строки, хранящиеся в файле (скажем, для одного случая, они равны 10). Фактический файл, содержащий строковые записи, разделенные символом новой строки; на общую сумму до 200 000 записей. Чтобы проверить, существуют ли шаблоны тестовых строк в большом файле, я написал небольшой вложенный цикл.

for i in `cat TestString.txt` 
do 
for j in `cat LargeFile.txt` 
do 
if [[ $i == $j ]] 
then 
echo "Match" >> result.txt 
fi 
done 
done 

Эта вложенная петля фактического должен делать обход (если я не ошибаюсь в понятиях), 10x200000 раз. Обычно я не вижу, что на сервере слишком много нагрузки, но время, как все время. Отрывок работает в течение последних 4 часов, с определенными «согласованными» результатами.

Есть ли у кого-нибудь идеи по ускорению этого? Я нашел так много ответов с python или perl touch, но я честно искал что-то в Unix.

Благодаря

+0

Ваш текущий код считывает одно слово за цикл. Когда 10 записей в TestString.txt содержат по 20 слов, вы будете проходить через файл LargeFile.txt 10x20x200.000 раз. Как часто вы проверяете? Когда файл LargeFile.txt также содержит 20 слов для каждой записи, вы имеете сравнение 10x20x200.000x20. –

+1

Вы должны перемещать '>> result.txt' за пределы циклов, поэтому вы не закрываете и не открываете файл для каждого цикла. –

ответ

3

Попробуйте следующее:

grep -f TestString.txt LargeFile.txt >> result.txt 
+0

Я всегда пропускаю силу grep. Идеальное решение. Спасибо Уолтеру. – knowone

+0

@knowone: Когда вы счастливы с этим ответом, вы можете принять его. –

+0

Готово. Извиняюсь, я должен был это сделать сам тогда. – knowone

1

ЗАКАНЧИВАТЬ grep

while read line 
do 
    cat LargeFile.txt | grep "$line" >> result.txt 
done < TestString.txt 

Grep выход будет все совпадения строки. Это может быть быстрее. Обратите внимание, что в вашем файле TestString.txt не должно быть пустых строк, или grep вернет все из файла LargeFile.txt.

+0

grep - это все, что я не принимал всерьез :) Работал отлично с этим подходом. Спасибо, кантели. – knowone

Смежные вопросы