2012-02-13 2 views
3

dbpedia 데이터를 커다란 덤프를 C# 응용 프로그램에로드하려고 할 때마다로드하려고 할 때마다 메모리가 부족합니다.거대한 DBpedia 덤프를로드하는 중 메모리가 부족합니다.

파일은 매우 큰 텍스트 파일로 수백만 개의 레코드를 보유하고 있으며 그 크기는 250MB 이상입니다 (그 중 하나는 실제로 7GB입니다!). 250MB 파일을 내 응용 프로그램에로드하려고하면 파일을 기다립니다 약 10 초 동안 내 RAM (6GB, 처음에는 2GB 사용)이 약 5GB로 증가하여 프로그램에서 메모리 부족 예외가 발생합니다.

메모리 부족 예외는 모두 메모리의 빈 인접한 덩어리에 관한 것이므로 프로그램에 이러한 파일을로드하는 방법을 알고 싶습니다.

다음은 파일을로드하는 데 사용하는 코드입니다. dotNetRDF 라이브러리를 사용하고 있습니다.

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

250MB 파일은 3GB를 차지하지 않습니다. 어떻게 파일을로드하고 있습니까? – Blorgbeard

+0

파일에서 트리플 저장소를로드하는 dotNetRDF라는 라이브러리를 사용하고 있는데, loadFromFile()이라는 클래스의 함수가 있습니다. http://bit.ly/yqPpJB – SKandeel

+0

로딩과 관련없는 방식을 찾을 수 없다면 먼저 전체 데이터베이스를 사용하면 더 많은 스왑을 추가 할 수 있습니다. –

답변

1

dotNetRDF는 단순히 메모리 내 저장소에서이 양의 데이터를 처리하도록 설계되지 않았습니다. 모든 데이터 파싱이 스트리밍되지만 모든 메모리를 차지하고 OOM 예외로 연결되는 데이터를 저장하기 위해 메모리 내 구조를 구축해야합니다.

기본적으로 트리플은 완전히 인덱싱되므로 SPARQL로 쿼리를 효율적으로 수행 할 수 있으며 현재 릴리스의 라이브러리 당 약 1.7kb의 트리플이 필요하므로 라이브러리를 통해 2-3 백만 개의 트리플을 처리 할 수 ​​있습니다 사용 가능한 RAM에 따라 메모리에 저장하십시오. 관련 점으로서 현재 릴리스의 SPARQL 알고리즘은 그 규모에서 끔찍한 것이므로 데이터를 메모리에로드 할 수 있다고해도 효과적으로 쿼리 할 수는 없습니다.

라이브러리의 다음 릴리스에서는 메모리 사용량이 줄어들고 SPARQL 성능이 크게 향상되지만 여전히 해당 볼륨의 데이터를 위해 설계되지는 않았습니다.

그러나 dotNetRDF는 다양한 네이티브 트리플 저장소 (IQueryableGenericIOManager 인터페이스 및 구현 참조)를 지원하므로 DBPedia 덤프를 해당 저장소에로드하는 방식으로 적절한 저장소에로드해야합니다 (더 빠른 dotNetRDF를 통한로드보다) dotNetRDF를 사용하여 쿼리를 수행하는 클라이언트로 사용합니다.

관련 문제