нехватка памяти при загрузке огромного дампа DBpedia - PullRequest
3 голосов
/ 13 февраля 2012

Я пытаюсь загрузить большой дамп данных dbpedia в свое приложение C #, каждый раз, когда я пытаюсь его загрузить, из памяти освобождается память.

Файлы представляют собой очень большие текстовые файлы, содержащие миллионы записей.и их размер составляет более 250 МБ каждый (один из них на самом деле 7 ГБ !!). Когда я пытаюсь загрузить файл 250 МБ в свое приложение, он ждет около 10 секунд, в течение которых увеличивается объем ОЗУ (6 ГБ, изначально использовалось 2 ГБ)чтобы использовать около 5 ГБ, программа выдает исключение из нехватки памяти.

Я понял, что исключение из нехватки памяти все о пустом смежном куске памяти, я хочу знать, как управлять загрузкой такогофайл в мою программу?

Вот код, который я использую для загрузки файлов, я использую библиотеку dotNetRDF .

TripleStore temp = new TripleStore();
//adding Uris to the store
temp.LoadFromFile(@"C:\MyTripleStore\pnd_en.nt");

1 Ответ

1 голос
/ 14 февраля 2012

dotNetRDF просто не предназначен для обработки такого количества данных в хранилище в памяти. Все данные анализируются в потоковом режиме, но вы должны создать структуры в памяти для хранения данных, которые занимают всю память и приводят к исключению OOM.

По умолчанию триплеты полностью индексируются, поэтому они могут эффективно выполнять запросы с помощью SPARQL и с текущей версией библиотеки, для которой потребуется приблизительно 1,7 КБ на триплет, так что в большинстве случаев библиотека позволит вам работать с 2-3 миллионами триплетов в память в зависимости от вашей доступной оперативной памяти. С другой стороны, алгоритм SPARQL в текущем выпуске ужасен в таком масштабе, поэтому даже если вы сможете загрузить свои данные в память, вы не сможете эффективно их запрашивать.

Несмотря на то, что в следующем выпуске библиотеки сокращено использование памяти и значительно улучшена производительность SPARQL, она так и не была разработана для такого объема данных.

Однако dotNetRDF поддерживает большое разнообразие встроенных тройных хранилищ из коробки (см. Интерфейс IQueryableGenericIOManager и его реализации), поэтому вы должны загрузить дамп DBPedia в соответствующее хранилище, используя этот механизм встроенной загрузки. (что будет быстрее, чем загрузка через dotNetRDF), а затем использовать dotNetRDF просто в качестве клиента, через который можно выполнять ваши запросы

...