Почему rdflib такой медленный? - PullRequest
1 голос
/ 12 июня 2019

У меня большой rdf-файл:

  • размер: 470 МБ
  • количество строк: почти 6 миллионов
  • уникальных тройных предметов: около 650 000
  • тройная сумма: около 4 200 000

Я загрузил определение rdf в базу данных Berkeley db rdflib через:

graph = rdflib.Graph("Sleepycat")
graph.open("store", create=True)
graph.parse("authorities-geografikum_lds.rdf")

На моем ноутбуке ушло много часов. Компьютер не очень мощный (процессор Intel B980, 4 ГБ ОЗУ, нет SSD), и определение его велико - но все же многие часы для выполнения этой задачи кажутся довольно длинными. Может быть, это отчасти связано с индексацией / оптимизацией структур данных?

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

SELECT (COUNT(DISTINCT ?s) as ?c)
WHERE {
    ?s ?p ?o
}

(Результат: 667,445)

заняло более 20 минут и

SELECT (COUNT(?s) as ?c)
WHERE {
    ?s ?p ?o
}

(Результат: 4197999)

заняло более 25 минут.

По моему опыту, реляционная СУБД, заполненная сопоставимыми данными, завершит соответствующий запрос за небольшую долю времени при соответствующей индексации.

Итак, мои вопросы:

Почему rdflib такой медленный (особенно для запросов)?

Можно ли настроить / оптимизировать базу данных, как я могу с индексами в СУБД?

Является ли другое (бесплатное и "компактное") тройное хранилище более подходящим для данных такого размера с точки зрения производительности?

...