Проблема
У меня есть тысячи CSV-файлов в папке.Каждый файл имеет 128 000 записей с четырьмя столбцами в каждой строке.Время от времени (два раза в день) мне нужно сравнивать список (10 000 записей) со всеми CSV-файлами.Если одна из записей совпадает с третьим или четвертым столбцом одного из файлов CSV, мне нужно записать всю строку CSV в дополнительный файл.
Возможные решения
Grep
#!/bin/bash
getArray() {
array=()
while IFS= read -r line
do
array+=("$line")
done < "$1"
}
getArray "entries.log"
for e in "${array[@]}"
do
echo "$e"
/bin/grep $e ./csv/* >> found
done
Кажется, это работает, но это длится вечно.После почти 48 часов скрипт проверил только 48 записей из примерно 10 000.
MySQL
Следующая попытка состояла в том, чтобы импортировать все файлы csv в базу данных mysql.Но там у меня были проблемы с моей таблицей на 50 000 000 записей.Поэтому я написал скрипт, который создал новую таблицу после 49 000 000 записей, и я смог импортировать все CSV-файлы.Я пытался создать индекс для второго столбца, но он всегда терпел неудачу (тайм-аут).Создать индекс до процесса импорта тоже было невозможно.Это замедлило импорт до нескольких дней вместо нескольких часов.Выбранное заявление было ужасно, но оно сработало.Гораздо быстрее, чем решение "grep", но все еще медленно.
Мой вопрос
Что еще я могу попытаться найти в файлах csv?Чтобы ускорить процесс, я скопировал все CSV-файлы в SSD.Но я надеюсь, что есть и другие способы.