문제

나중에 다른 Java 프로세스에 의해 처리 되려면 작은 객체의 엄청난 양의 데이터 (약 2GIG)를 단일 파일로 직렬화해야합니다. 성능은 일종의 중요합니다. 누구든지 이것을 달성 할 수있는 좋은 방법을 제안 할 수 있습니까?

도움이 되었습니까?

해결책

Google을 살펴 보셨습니까? 프로토콜 버퍼? 사용 사례처럼 들립니다.

다른 팁

Java Serialization이 왜 투표했는지 모르겠습니다. 완벽하게 실행 가능한 메커니즘입니다.

원래 게시물에서 명확하지 않지만 힙에 2G의 데이터가 동시에 있습니까? 아니면 다른 것을 버리고 있습니까?

상자 밖에서 직렬화는 "완벽한"솔루션이 아니지만 객체에서 외부화가 가능하면 직렬화가 잘 작동 할 수 있습니다. 직렬화 큰 비용은 무엇을 쓸지, 작성 방법을 파악하는 것입니다. 외부화 가능성을 구현함으로써 그러한 결정을 손에 쥐고 성능이 상당히 높아지고 우주 절약을 얻을 수 있습니다.

I/O는 대량의 데이터를 작성하는 데 드는 주요 비용이지만 데이터 변환의 부수적 비용도 매우 비쌀 수 있습니다. 예를 들어, 모든 숫자를 텍스트로 변환 한 다음 다시 돌아가서 가능하면 더 기본 형식으로 저장하는 것이 좋습니다. ObjectStream에는 자바에서 기본 유형을 읽고 쓰는 방법이 있습니다.

모든 데이터가 단일 구조에로드되도록 설계된 경우 외부화가 가능한 구현 후 ObjectOutputStream.writeObject (YourBigDatrastructure)를 수행 할 수 있습니다.

그러나 구조를 반복하고 개별 객체에서 WriteObject를 호출 할 수도 있습니다.

어느 쪽이든, 당신은 아마도 "ObjectTofile"루틴, 아마도 몇 가지가 필요할 것입니다. 그리고 그것은 효과적으로 외부화 가능한 제공과 구조를 걷는 프레임 워크입니다.

물론 다른 문제는 버전화 등입니다. 그러나 모든 직렬화 루틴을 직접 구현하기 때문에이를 완전히 제어 할 수 있습니다.

내 마음에 즉시 오는 가장 간단한 접근법은 Nio (java.nio.mappedBytebuffer)의 메모리 매핑 버퍼를 사용하는 것입니다. 하나의 객체의 크기에 해당하는 단일 버퍼 (대략)를 사용하고 필요할 때 출력 파일에 플러시/첨가하십시오. 메모리 매핑 버퍼가 있습니다 매우 효과적인.

Java Serialization을 사용해 보셨습니까? 당신은 그들을 사용하여 그것들을 쓸 것입니다 ObjectOutputStream 그리고 다시 사용하면서 다시 읽으십시오 ObjectInputStream. 물론 수업은해야합니다 Serializable. 그것은 낮은 노력 솔루션이 될 것이며, 물체는 이진에 저장되기 때문에 작고 빠릅니다.

성능이 매우 가져 오면 자체적으로 작성해야합니다. 소형 바이너리 형식을 사용해야합니다. 2GB의 경우 디스크 I/O 작동이 매우 중요하기 때문입니다. XML 또는 기타 스크립트와 같은 사람이 읽기 쉬운 형식을 사용하는 경우 데이터를 2 개 이상으로 크기로 조정합니다.

데이터에 따라 압축 속도가 낮은 가격으로 데이터를 즉시 압축하면 속도가 빨라질 수 있습니다.

기존 객체에 대한 참조 인 경우 모든 객체에 대한 Java 점검을 읽을 때 Java Serialization입니다.

데이터베이스 대안으로 joafip을 개발했습니다.

Apache Avro 유용 할 수도 있습니다. 언어 독립적으로 설계되었으며 구속력이 있습니다. 인기있는 언어.

확인 해봐.

프로토콜 버퍼 : 의미가 있습니다. 여기 위키에서 발췌 한 내용이 있습니다. http://code.google.com/apis/protocolbuffers/docs/javatutorial.html

더 많은 속도를 얻습니다

기본적으로 프로토콜 버퍼 컴파일러는 반사를 사용하여 대부분의 기능을 구현하여 작은 파일을 생성하려고 시도합니다 (예 : 구문 분석 및 직렬화). 그러나 컴파일러는 또한 메시지 유형에 대해 명시 적으로 최적화 된 코드를 생성 할 수 있으며, 종종 크기의 성능 향상을 제공하지만 코드 크기를 두 배로 늘릴 수도 있습니다. 프로파일 링에 응용 프로그램이 프로토콜 버퍼 라이브러리에서 많은 시간을 소비하고 있음을 보여 주면 최적화 모드를 변경해야합니다. .proto 파일에 다음 줄을 추가하기 만하면됩니다.

옵션 OPTIMIZE_FOR = 속도;

프로토콜 컴파일러를 다시 실행하면 매우 빠른 구문 분석, 직렬화 및 기타 코드가 생성됩니다.

데이터베이스 솔루션을 고려해야 할 것입니다. 모든 데이터베이스는 정보를 최적화하는 것이며, 최대 절전 모드를 사용하는 경우 객체 모델을 그대로 유지하고 실제로 DB에 대해 생각조차하지 않습니다 (저는 그것이 최대 절전 모드라고 불리는 이유입니다. 데이터를 저장 한 다음 다시 가져 오십시오)

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