Привет, ЛОР.
Хочу посоветоваться насчет правильного выбора средств решения задачи. Занимаюсь по сути data-mining'ом.
Например, текущая задача - обработка дампов Википедии с целью извлечения информации о некоторых объектах и сопоставлением этой информации на различных языках. Мой любимый инструмент для решения подобных задач уже несколько лет это утилиты из GNU coreutils - join, sort, comm, grep, shuf, cut и perl для всего, что сложно или невозможно сделать через эти утилиты.
Получаются скрипты вроде такого
sort -k1,1 links/title2id.de.txt > links/title2id.de.title-sorted.txt
# ...
join -t $'\t' -1 1 -2 1 <(cut -f 1,2 result/en/infoblock.txt | sort -t $'\t' -k1,1 ) links/en.ext.txt > result/en/ext-all.txt
# idEn nameEn + idEn linkLang nameLang = idEn nameEn linkLang nameLang
# ...
comm --check-order -23 <( cut -f 4 result/en/ext$1-id.txt | sort -t $'\t' -k1,1 ) result/$1/infoblock.ids.txt > result/en/ext$1-only.txt
В этом подходе для меня почти всё идеально, за исключением двух проблем:
- Это слишком низкий уровень, работаю с нумерованными колонками, а не именованными полями. Добавление поля в исходные данные взрывает скрипты.
- Мне не нравится, что нужно пересчитывать всё, если я поменял только одну строчку в длинном скрипте. Я пробовал вставлять конструкции
if [[ result -ot source ]]; then...
Но код раздувается и нет доверия этим проверкам, так как допустить тут ошибку ( пропустить зависимость result от какого-то исходника ) очень просто.
Кто-то скажет, чувак, а теперь открой для себя базы данных. Я помню о базах данных. Это то, для чего они сделаны, но у меня может быть слишком много данных. Например, в англ. Википедии 55 млн. страниц. В примерах, которые показывают мой способ решения, я пользуюсь только внешней памятью, а память для sort можно установить определенную.
Короче говоря, хочется что-то аналогичное тому что использую сейчас, но
- с проверкой актуальности данных ( не пересчитывать то, что готово ),
- именованные колонки
- работой с данными во внешней памяти,
- возможность вызова Perl или Java ( которые я бм знаю ) для того, чтобы пошерстить регулярками или разобрать XML и выдрать из него что-то и т.п.
Postgres ? XML-базы данных с XSLT ? теряюсь в догадках.