У меня большой 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 такой медленный (особенно для запросов)?
Можно ли настроить / оптимизировать базу данных, как я могу с индексами в СУБД?
Является ли другое (бесплатное и "компактное") тройное хранилище более подходящим для данных такого размера с точки зрения производительности?