문제

데이터베이스에 큰 배열 (10000x100)을 저장하는 가장 효율적인 방법은 무엇입니까? Java로 작성하는 특정 수학 프로그램을 위해이 작업을 수행해야합니다. 도와주세요. 전체 배열은 검색되고 자주 저장됩니다 (그다지 개별 요소가 아님). 또한 배열에 대한 일부 메타 데이터는 배열에 저장해야합니다.

도움이 되었습니까?

해결책

좋은 질문.

배열을 정규화 된 테이블 세트로 변환하려고하지 않는 한, 그렇지 않은 것처럼 들리는 소리는 직렬화를 고려하고 싶을 수도 있습니다.

직렬화는 객체를 디스크 또는 데이터베이스에 저장할 수있는 형식으로 전환하는 멋진 단어입니다. 직렬화를위한 두 가지 주요 형식은 이진과 XML이며, Java가이를 지원한다고 내기하고 있습니다.

사용중인 데이터 유형에 따라 배열을 XML 또는 바이너리로 전환 한 다음 데이터베이스의 단일 필드에 저장할 수 있어야합니다. 체크 아웃하여 자바 에서이 기술을 시작할 수 있습니다. http://java.sun.com/developer/technicalarticles/programming/serialization/. .NET에 내장되어 있다는 것을 알고 있습니다.

이것이 도움이되기를 바랍니다. 더 이상 방향을 줄 수 있는지 알려주세요.

다른 팁

데이터를 블로브로 저장하고 Java를 사용하여 블로브를 실제 Java 어레이로 디코딩하는 것은 어떻습니까? 전체 배열을 하나의 걸프로 저장하고 검색하는 데 훨씬 효율적이지만 개별 요소를 두드리는 것은 끔찍할 것입니다.

XML, JSON, 자신과 함께 제공하는 일부 이진 파일 또는 다른 형태의 직렬화 등 내부 표현을 생각해보십시오.

"Blob"데이터 유형을 사용하여 테이블에 보관하십시오. 매트릭스와 관련된 메타 데이터를 추가 열에 저장하십시오.

나는 그것을하는 방법이 매트릭스와 동일한 수와 열을 가진 테이블을 만드는 것이라고 강력히 동의하지 않습니다. 그것은 당신이 사용하지 않는 기능에 대해 지불하기위한 매우 높은 가격입니다.

삽입/선택 문서를 미리 준비하고 바인드 변수를 사용하여 작업중인 매트릭스를 변경하십시오. DB를 모든 요청을 다시 만들지 마십시오.

배열이 단 1 인 경우 바이너리 파일을 사용하지 않는 이유는 무엇입니까?

Allready가 제안한대로 : 기능이 필요하지 않은 경우 RDBMS를 사용하지 마십시오. 직렬화 대신 저수준 API와 같은 저수준 API를 동의하고 싶을 수도 있습니다. JDBM 이는 온 디스크 인덱스 관리와 같은 기능과 같은 일부 데이터베이스를 제공합니다.

데이터가 조밀하게 포장 된 경우 (값 히스토그램이 플랫 라인에 가깝습니다) 최상의 선택은 객체 [출력/입력] 스트림을 사용한 블로브 및 직렬화입니다.

그렇지 않으면 스파 스 배열과 엔티티 부여-값 스키마의 변형을 사용하는 것이 더 효율적일 수 있습니다. 예는 다음과 같습니다.

 Name | IndexKey  | Value
------+-----------+-------
 foo  | 'default' | 39        
 foo  | 0:0:0     | 23
 foo  | 0:0:1     | 34
 foo  | 1:5:0     | 12
 ...
 bar  | 1:3:8     | 20
 bar  | 1:3:8     | 23
 bar  | 1:1:1     | 24
 bar  | 3:0:6     | 54
 ...

또한 테이블의 일부를 빠르게 업데이트하고 SQL 'Like'연산자를 사용하여 슬라이스를 선택할 수 있습니다.

인덱스 효율을 향상시키고 더 유연한 선택 기준을 갖기 위해 각 차원의 int 열을 분리하기 위해 키 열을 분리하기 위해 치수 수가 고정되어있는 경우 (기본값과 같은 메타 데이터에 첫 번째 색인 'NULL'을 사용할 수 있습니다) .

어쨌든 이름 인 indexkey 열에 클러스터 된 인덱스를 만드는 것이 좋습니다.

배열이 보유한 데이터로 테이블을 정의하고 배열 값을 테이블에 삽입하십시오.

이것은 매우 간단한 데이터 액세스/스토리지입니다. 배열 치수가 항상 동일합니까?

  • 하나의 큰 명시 적 거래에서 수행하십시오. 데이터베이스 시스템이 모든 삽입에 대한 새로운 암시 적 트랜잭션을 만들도록 강요하지 마십시오.
  • 준비된 진술을 사용하십시오.

PostgreSQL에는 배열이 내장되어 있습니다.

http://www.postgresql.org/docs/8.0/interactive/arrays.html

블로브로 저장된 바이트 어레이에 대한 Java 직렬화가 최선의 방법입니다. Java는 큰 배열을 매우 효율적으로 연속화합니다. 나머지 행 열을 사용하여 쿼리하거나 쉽게 표시하는 데 관심이있는 내용을 사용하십시오. 또한 블로브를 자신의 테이블에 보관하고 "일반"행이 "블로브"행을 가리키는 것이 좋습니다. 비 블로브 데이터에 대해 쿼리하고보고하는 경우 데이터베이스 구현에 따라 다를 수 있습니다. ).

HSQLDB 2.0은 테이블 열로 저장된 1 차원 배열을 지원합니다. 따라서 테이블의 각 행은 2D 배열의 한 줄에 해당합니다.

그러나 2D 배열을 전체적으로 리르레드하고 싶다면 Blob이 최상의 솔루션입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top