LINUX.ORG.RU

анализ данных

 


1

2

Привет, ЛОР.

Хочу посоветоваться насчет правильного выбора средств решения задачи. Занимаюсь по сути 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 ? теряюсь в догадках.

Ещё вот нарыл Apache Spark. Не знаю, как там с пересчетом готового.

anonymous
()

используй реляционные Базы Данных, они настраиваются по ресурсам

anonymous
()

Все зависит от количества данных и того, насколько они структурированы. Выше советовали уже spark — не уверен что взять, возьми его.

А 55млн страниц хоть куда запихать можно, если с умом подойти. Определись с входными и выходными данными.

kardapoltsev ★★★★★
()

Короче говоря, хочется что-то аналогичное тому что использую сейчас, но
именованные колонки

БД в виде простых текстовых файлов есть в GNU recutils. Но есть большие сомнения насчёт производительности на больших объёмах.

unterwulf
()

http://sedna.org - у них есть(точнее был) даже демо-сайт http://wikixmldb.org/ который делал ровно то что вы хотите. Может там ваша задача вообще где-то в исходниках лежит готовая :-)

ps. посмотрел повнимательнее, да действительно решение вашей задачи там есть и можно скачать : http://wikixmldb.org/help/deployment/

MKuznetsov ★★★★★
()
Последнее исправление: MKuznetsov (всего исправлений: 1)

Спасибо за советы. Сейчас я подыскиваю правильный подход к будущей похожей задаче. Возможно, будет правильно заюзать make ( какой-нибудь наиболее продвинутый) + продолжать работать с tab-separated файлами, или забить на зависимости задач и заюзать Apache Spark. Или не делать ничего :-)

Вообще было бы здорово в какой-нибудь shell, например bash, впилить опцию расчета по необходимости. Такой шелл мог бы сохранить рядом с файлом аннотацию, как был получен результат - из каких исходных файлов и какой программой ( или подпрограммой ) с какими опциями. Тогда триггером пересчета был бы факт устаревания файла результата.

anymouse
() автор топика
Ответ на: комментарий от anymouse

Использовать make для не связанных с компиляцией задач довольно просто, стоит попробовать.

links/title2id.de.title-sorted.txt: links/title2id.de.txt
	sort -k1,1 $< > $@

Ну а номера полей выделить в переменные.

Ещё вариант - сделать свои обёртки над утилитами, которые бы принимали строки вместо номеров полей, читали первую строку-заголовок каждого файла, вясняли номера полей и запускали уже реальную утилиту.

legolegs ★★★★★
()
Последнее исправление: legolegs (всего исправлений: 1)
Ответ на: комментарий от legolegs

Можно даже так:

%.title-sorted.txt: %.txt
	sort -k1,1 $< > $@

final-result.txt: links/title2id.de.title-sorted.txt
	do_it $< > $@

legolegs ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.