2013-10-06 3 views
1

현재 과학 데이터 세트를 기가 바이트로 작업해야하는 프로젝트를 진행 중입니다. 데이터 세트는 정수와 부동 소수점 수의 매우 큰 배열 (30,000 요소) 형태입니다. 여기서 문제는 너무 커서 메모리에 적합하지 않기 때문에 저장 및 작업을위한 디스크 솔루션이 필요하다는 것입니다. 이 문제를 더욱 재미있게 만들기 위해 32 비트 아키텍처를 사용하기로 했으므로이 솔루션의 성능을 극대화해야합니다.과학적 데이터 세트를 디스크에 저장하는 최선의 방법 C++

지금까지 HDF5를 사용해 보았지만 괜찮 았지만 작동하기가 너무 복잡했습니다. 그래서 NoSQL 데이터베이스를 시도하는 것이 최선의 방법이라고 생각했지만 배열을 데이터베이스에 저장하고 문자 배열에 캐스팅하지 않고 저장하는 좋은 방법을 찾지 못했습니다. 나쁜 포인터 두통.

그래서, 나는 당신이 뭘 추천하는지 알고 싶습니다. 어쩌면 HDF5로 작업하는 데 어려움을 덜 줄뿐만 아니라 동시에 성능을 극대화 할 수 있습니다. 또는이 유형의 데이터를 저장하는 데 잘 작동하는 NoSQL 데이터베이스를 알고있을 수도 있습니다. 아니면 이걸로 완전히 잘못된 방향으로 가고있어, 너는 내게 어떤 의미를 더하고 싶어.

어쨌든, 지혜의 말씀을 감사하겠습니다 너희들은 나에게 제공 할 수 있습니다 :

+2

30,000 개의 요소가 Apple II의 메모리에 적합하지 않을 수도 있지만, 합리적으로 현대적이며 유능한 메모리에도 적합해야합니다. –

+0

네, 정확 합니다만 배열은 데이터 집합의 한 요소에 해당합니다. 수백만 개의 배열이 있으므로 30,000 * 1,000,000에 가까워 질수록 메모리에 저장하는 것이 더 어려워 질 것입니다. – Andrewziac

답변

2

를 데이터 세트를 가정하면 정말, 30,000 요소 대신의 30,000x30,000 배열 등 장점 (충분히 큰 두 배로), STXXL을 고려할 수 있습니다. 이 인터페이스는 C++ 표준 라이브러리의 컬렉션을 모방하기위한 인터페이스를 제공하지만 너무 큰 데이터를 메모리에 저장하기위한 인터페이스를 제공합니다.

+0

예, my 데이터 세트는이 구경 (30,000 * 1,000,000)의 것이어야합니다. 내 나쁜 :) 어떤 경우에는 STXXL을 사실대로 시도했지만 쓰려고하면 bad_alloc 오류가 발생했습니다. 존재하지 않는 메모리 (제 생각에는 ...) 내 요구를 좀더 명확하게하기 위해 stxxl 관점에서 정수형 키와 int 배열 쌍을 유지하고 값으로 배열을 플로팅하는 데 약 20 개의 맵이 필요합니다. 지도를 선언 할 때 잘못된 할당 오류가 있지만 특정 숫자 (17 또는 18 믿을만 함)를 선언 한 후에 만 ​​조언이 제공됩니까? – Andrewziac

+0

귀하의 문제는 라이브러리의 오용 일뿐입니다. 코드를 공유하면 문제가 무엇인지 찾아 낼 수 있습니다. – Havenard

+0

너무 늦게 다시 드려 죄송합니다. 사실, 내 bad_alloc 문제를 해결 한 것,하지만 내 진짜 문제는 지금 boost :: noncopyable 오류를 얻고있다 ...이 문을 사용하여 맵을 생성 할 :'stxxl :: map 오류 : C2248 : 'boost :: noncopyable _ :: noncopyable :: noncopyable'> node_map (stxxl :: unsigned_type) (4096 * 4), (stxxl :: unsigned_type) (4096 * 3) : 'boost :: noncopyable _ :: noncopyable'클래스에 선언 된 비공개 멤버에 액세스 할 수 없습니다. 귀하의 의견을 진심으로 감사드립니다. – Andrewziac

3

자신에게 어떤 의미가 있는지, HDF5와 같은 제작 등급 라이브러리를 사용하십시오. 그래서 너무 복잡하다는 것을 알았지 만 high-level APIs을 찾았습니까?

답변이 마음에 들지 않으면 SciDB, rasdaman 또는 MonetDB과 같은 최신 어레이 데이터베이스 중 하나를 사용해보십시오. 나는 당신이 HDF5에서 baulked했다면, 당신은 이것들 중 어느 것에도 답할 것입니다.

필자의 견해와 경험에 비추어 볼 때, 어느 정도의 시간 동안 대형 과학 데이터 세트로 작업하려는 경우 HDF5와 같은 도구를 올바르게 사용하는 방법을 배우는 것이 좋습니다. 당장의 작업을 위해 설계되지 않은 NoSQL 데이터베이스와 같은 도구를 선택하는 경우 처음에는 사용하기가 더 쉽지만 궁극적으로 (필자는 오래 전에) 필요한 기능이 부족하거나 당신은 자신의 결함을 프로그램해야한다는 것을 알게 될 것입니다.

작업에 적합한 도구 중 하나를 선택하고 올바르게 사용하는 법을 배우십시오.

+0

조언을 주셔서 감사합니다.하지만 미안하지만 조금은 미안합니다. hehe ... HDF5는 사용하기에 너무 복잡하지 않고 충분히 최적화해야합니다. 더 많은 작업이 필요합니다. (내가 말할 수있는 한). h5 파일에 모든 배열을 추가하고 잘 읽을 수는 있지만 속도는 없습니다. 데이터를 메모리에 배열하는 방법과 성능을 향상시키는 데 사용할 수있는 다양한 기능이 있다는 것을 알고 있습니다. 그러나 덜 복잡한 라이브러리로 비슷하거나 더 나은 성능을 얻을 수 있다면 보는 것이 좋습니다. 미래의 두통으로부터의 나 자신 – Andrewziac

2

저는 수년간 과학적 컴퓨팅을 연구 해 왔으며, HDF5 또는 NetCDF가 함께 작업하기에 적합한 데이터 형식이라고 생각합니다. 대용량 데이터를 처리하는 데 중요한 병렬 읽기/쓰기를 효율적으로 제공 할 수 있습니다.

대체 솔루션은 SciDB, MonetDB 또는 RasDaMan과 같은 배열 데이터베이스를 사용하는 것입니다. 그러나 HDF5 데이터를 배열 데이터베이스에로드하려고하면 다소 고통 스러울 것입니다. 한때 HDF5 데이터를 SciDB에로드하려고 시도했지만 일련의 데이터 변환이 필요합니다. 데이터를 자주 질의하는지 아닌지를 알아야합니다. 자주는 아니지만 시간이 많이 걸리는 작업은 가치가 없을 수 있습니다.

this paper에 관심이있을 수 있습니다. SQL을 사용하여 HDF5 데이터를 직접 쿼리 할 수 ​​있습니다.