2009-09-23 5 views
4

나는 데이터베이스 쿼리에서 많은 양의 데이터를 얻었으므로 그것들의 객체를 만들고있다. 나는 마침내이 객체들 (약 1M)의 목록을 가지고 있으며 나중에 사용할 수 있도록 디스크에 직렬화하려고합니다. 문제는 메모리에 거의 맞지 않으며 미래에도 적합하지 않기 때문에 처음으로 100k, 다음 100k 등을 직렬화 할 시스템이 필요합니다. 또한 100k 단위로 데이터를 다시 읽습니다.매우 큰 목록을 직렬화

목록이 너무 커지면 'list1', 'list2'등으로 파일을 검사 할 수있는 확실한 코드를 만들 수 있지만이를 처리하는 데 더 좋은 방법이있을 수 있습니까?

+0

+1 흥미로운 질문입니다. – KLE

답변

3

목록을 살펴보고 개체를 만든 다음 바로 파일에 쓸 ObjectOutputStream에 피드를 보낼 수 있습니다.

+0

하지만 OOS가 파일에 추가합니까? 파일에서 하나씩 개체를 읽는 것과 동일한 방법이 있습니까? – kresjer

+0

예, ObjectInputStream이 반대로 수행합니다 –

+0

좋은 대답입니다. 참고로, 나는 비슷한 것을 최근에했고, BufferedOutputStream에 FileOutputStream을 래핑하여 큰 성능 향상을 발견했습니다. GZIP OutputStream을 던져서 디스크 공간을 절약 할 수 있습니다. new ObjectOutputStream (new GZIPOutputStream (new BufferedOutputStream (new FileOutputStream (myFile))))); –

2
  1. DB를에서 오브젝트를 하나씩 읽어

  2. 당신은 DB

결코에서 그들을 얻을로 목록에 넣어하지만 파일로 작성하지 마십시오 RAM에 하나 이상의 개체를 유지하십시오. 객체를 읽을 때 readObject()null (= 파일의 끝)을 반환하면 읽기 루프를 종료하십시오.

1

내가 실제로 선택한 것 같아요. 데이터를 디스크에 저장해야합니다. 데이터베이스에 머물 수는 없었습니까? 요청과

  • 시작 :

    가 너무 큰 데이터를 처리하기 위해, 당신은 덩어리하여 데이터를 얻을

    하나 개의 아이디어는 그 작은 :-)해야 그래서 이 거대한 목록을 만들지 마십시오 (조만간 실패 지점이 될 것이므로)

  • 더 작은 목록의 객체를 직렬화하십시오
  • 은 루프는
1

는 전체 결과 집합을 가져 오는에 예를 들어, 또한 JDBC 드라이버 MySQL의 기본 설정에 대한 JDBC 드라이버를 페치 크기를 설정하는 방법에 대한 생각.

자세한 내용은 여기를 읽어 fetch size

0

당신이 DB에서 큰 데이터 세트를 불러 오는 단일 샷에서 객체의리스트로 변환하고이를 직렬화하는 것으로 보인다.

그럴 수 없어. 결국 응용 프로그램이 중단 될 수 있습니다.

  • 데이터베이스에서 검색 한 데이터의 양을 최소화하기 위해

    대신, 당신은. (대신 1000 레코드 대신 1 M)

  • 비즈니스 개체로 변환
  • 그리고 직렬화하십시오.
  • 그리고는 마지막 레코드

당신이 성능 문제를 방지 할 수 있습니다 이런 식으로 될 때까지 동일한 절차를 수행합니다.

0

ObjectOutputStream은 작동하지만 더 많은 오버 헤드가 있습니다. 나는 DataOutputStream/DataInputStream이 더 나은 선택이라고 생각한다.

하나씩 읽기/쓰기 만하면 스트림이 버퍼링을 걱정하지 않도록하십시오. 예를 들어, 다음과 같이 할 수 있습니다.

DataOutputStream os = new DataOutputStream(new FileOutputStream("myfile")); 
    for (...) 
     os.writeInt(num); 

오브젝트 및 데이터 스트림 모두를 사용하는 하나의 예는 write (int)가 1 바이트 만 쓰는 것입니다. writeInt (int)를 사용하십시오.