문제

내가 지원하거 Java 응용 프로그램을 사용하는 평일(일반 텍스트)에 대한 지속성을 알려준다.으로 인해 응용 프로그램의 특성,이 파일의 크기에 도달 할 수 있습 100MB 하루에,그리고 종종 제한 요인에서는 응용 프로그램 성능이 파일 IO.현재 응용 프로그램을 사용하 ol'java.io.FileOutputStream 데이터를 기록하는 디스크에 있습니다.

최근에,우리는 몇 개발자가 주장하는 메모리를 사용하여 매핑된 파일에 구현된 원시 코드(C/C++)에 액세스를 통해,JNI 를 제공 할 것이라 더 큰 성과입니다.그러나,FileOutputStream 이미 사용하고 기본 방법에 대한 핵심 방법(즉쓰(byte[])),그래서 그것을 나타 얇은 가정 없이 하드 데이터 또는 적어도 일화는 증거입니다.

나는 몇 가지 질문에 이:

  1. 은 이 주장이 정말 사실입니까?이 매핑된 파일을 메모리 제공 빠른 IO 에 비해 Java FileOutputStream?

  2. 는 클래스 MappedByteBuffer 에서 액세스 FileChannel 제공 과 동일한 기능을 원 메모리에 매핑된 라이브러리 파일 액세스 을 통해 JNI?는 무엇입 MappedByteBuffer 이 부족하로 이어질 수도 있습니다 사용 JNI 솔루션?

  3. 의 위험은 무엇을 사용하여 메모리에 매핑된 파일에 대한 디스크 입출력 생산 응용 프로그램?즉,응용 프로그램 는 지속적인 가동 시간과 최소 재부팅(한 달에 한 번,최대).실제 삶의 일화가 생산 응용 프로그램(Java 또는 그렇지 않으면) 바람직하다.

#3 질문은 중요하다-내가 응답할 수 있 이 질문에 자신 부분적으로 를 작성하여 장치의 응용 프로그램 성능 테스트 IO 다양한 옵션을 사용하여 위에서 설명하지만,게시하여 그래서 바라고 있어요 실제 일화/데이터를 씹니다.

[편집]정화-매일의 작업에,응용 프로그램은 여러 파일을 만듭하는 범위에서 크기 100MB1gig.총 응용 프로그램을 작성할 수 있습 여러 공연의 데이터습니다.

도움이 되었습니까?

해결책

할 수 있게 속도를 올을 검사하여 어떻게 데이터를 버퍼링되는 동안에 기록합니다.이 경향이 특정 응용 프로그램으로 해야의 아이디어가 예상되는 데이터를 쓰는 패턴이 있습니다.는 경우에 데이터를 일관성이 중요있을 것이 단점이 여기에.

만약 당신이 단지를 쓰면서 새로운 데이터를 디스크에서의 응용 프로그램,memory mapped I/O 아마는 것은 많은 도움이되지 않습니다.보이지 않는데 이유는 당신이 투자하고 싶은 시간에 사용자 지정 코드 네이티브 솔루션입니다.그것이 너무 복잡한 응용 프로그램에서,당신이 무엇을 제공합니다.

확신하는 경우 당신은 정말 필요 더 나은 I/O 성능-또는 O 성능을 당신의 경우에,나는 것으로 보면 하드웨어 솔루션과 같은 조정된 디스크에 배열입니다.더 던져 하드웨어에 문제가 종종 시간에 더 많은 비용 효과적인 비즈니스 관점에서의 볼 시간을 보내는 것보다 최적화하는 소프트웨어입니다.그것도 일반적으로 더 빨리를 구현하고 더 많은 신뢰할 수 있습니다.

일반적으로,많은 함정에서의 최적화를 소프트웨어입니다.을 소개하는 새로운 형태의 문제 응용 프로그램입니다.를 실행할 수 있습으로 메모리 문제가/GC 탈곡으로 이어질 것이 더 유지보수/조정됩니다.최악의 부분은 많은 이러한 문제의하기 어려울 것입 테스트으로 가기 전에 생산.

었다면 내 응용 프로그램,내가 스 FileOutputStream 으로 일부 수정 버퍼링이다.후에는 내가 사용하여 시간 영광의 솔루션을 던지고 더 하드웨어입니다.

다른 팁

Memory mapped I/O 하지 않을 것이다 당신의 디스크는 빠르게 실행(!).을 위한 선형 액세스 보트 무의미합니다.

A NIO 매핑된 버퍼는 실제의 것(보통주의에 대한 모든 합리적인 구현에).

다른 NIO 직접 버퍼가 할당된 버퍼하지 않은 일반 메모리고 늘 글로벌시민교으로 효율적으로 합니다.을 만드는 경우 그들 중 많은 찾을 수 있는 메모리 주소 공간을 실행하지 않고 밖으로 자바의 힙.이것은 분명히 걱정과 함께 오래 실행되는 프로세스입니다.

내 경험에서 메모리 매핑된 파일을 수행보다 훨씬 더 일반 파일 액세스를 모두 실시간으로 지속 사용 사례를 보여주고 있습니다.일했으로 주로 C++,Windows,하지만 리눅스 공연과 유사,당신은 계획을 사용하는 사용자 어쨌든,그래서 나는 생각에 적용되는 문제입니다.

예를 들어의 지속성 엔진에 내장 메모리에 매핑된 파일을 참조하십시오 Metakit.나는 그것을 사용 응용 프로그램에서는 물체들은 간단한 전망을 메모리에 매핑된 데이터가 엔진을 처리했의 모든 매핑 뒤에 물건 커튼 등이 있습니다.이는 모두 빠르고 효율적인 메모리는(적어도 비교한 전통적인 접근 방법과 같은 사람들은 이전 사용되는 버전),그리고 우리는 commit/롤백 트랜잭션에 대한 무료입니다.

다른 프로젝트에서 나를 쓰 멀티캐스트 네트워크 응용 프로그램.데이터를 보내에서 무작위 순서로 영향을 최소화하려면의 연속적인 패킷소(와 결합 FEC 및 차단하는 방식).또한 데이터를 수 초과하는 주소 공간(동영상 파일보다 큰 2Gb)그래서 메모리를 할당었다 질문입니다.서버 측에서,파일 섹션들의 메모리 맵에서 요구하고 네트워크 계층을 직접 고른 데이터에서 이러한 보기결과적으로 메모리 사용량이 매우 낮습니다.수신기 쪽에서,방법이 없었습을 예측하기 위해되는 패킷을 수신했다,그래서 그것을 유지하는 제한된 수의 활동망에 대상이고,파일 데이터로 복사되었으로 직접 이러한 전망이다.패킷이 있어야 했에 매핑되지 않은 지역,가장 오래 전망 매핑되지 않음(그리고 결국 러시으로 파일 시스템에 의해)및 대체에 대한 새로운 전망을 대상 영역입니다.공연들,특히 때문에 시스템에 훌륭한 일을 저지르고 데이터를 배경으로 작업,그리고 실시간 제약 조건들을 쉽게 만났다.

그 이후로 저는 확신하고 심지어 가장 잘 만들어진 소프트웨어 방식을 이길 수 없습 시스템의 기본값은 I/O 정책으로 메모리에 매핑된 파일이기 때문에,시스템보다 더 잘 아는 사람은 사용자 공간 응용 프로그램에 대해 언제 어떻게 데이터를 작성해야합니다.또한,중요한 것이 무엇인을 알고 있는 메모리 맵핑을 이해야를 다룰 때 큰 데이터이기 때문에,데이터는 적당(따라서 메모리를 사)하지만 동적으로 매핑으로 주소,공간과에 의해 관리 시스템의 가상 메모리 관리자는 항상보다 더 빠르게 힙.그래서 시스템을 항상 사용하여 메모리에 최적으로,그리고 커밋 데이터를 때마다 필요한 뒤에,응용 프로그램의 뒷면에 영향을 주지 않습니다.

도움이 되기를 바랍니다.

로 포인트 3-면 기계가 충돌하고 있는 페이지가 있는지지 않은 디스크로 플러시,그리고 그들은 손실됩니다.다른 것은 폐기물의 주소공간에 매핑하는 파일을 메모리 주소 공간을 소비(필요 연속 영역),및,32 비트 컴퓨터에서의 약간 제한됩니다.그러나 당신에 대해 말했다 100MB-는 문제입니다.그리고 하나 더 것-의 크기를 확대 mmaped 파일 몇 가지 작업이 필요합니다.

방법으로, 이렇게 토론 도 줄 수 있는지 당신은 어떤 통찰력을 제공합니다.

연구 어디서 나는 비교를 쓰기 성능을 원 ByteBuffer 대 쓰 성능 MappedByteBuffer.메모리에 매핑된 파일에 의해 지원되는 OS 와 그들의 쓰기 지연은 아주 좋은 당신이 볼 수있는 내 벤치마크 숫자입니다.수행하는 동시 쓰기을 통해 FileChannel 은 약 20 시간이 느리고 그 이유는 사람들이 비동기식 로깅 모든 시간입니다.에서 내부 또한 주의를 구현하는 방법 비동기식 로깅을 통해 잠금을 해제하고 쓰레기-무료 큐 궁극적 인 성능에 매우 가까운 원 ByteBuffer.

당신이 쓰는 경우에 적은 수의 바이트는 것이 더 빠르다.어떤 경우 필터링을 통해 그것 gzipoutputstream,또는 당신은 당신의 데이터 ZipFiles 또는 JarFiles?

위에서 언급한 바와 같이,사용하 NIO(니다.k.니다.새로운 IO).또한 새로운,새로운 IO 고 있습니다.

의 적절한 사용 RAID 하드 드라이브 솔루션을 도울 것을,하지만 고통이 될 것입니다.

내가 정말 좋아하는 아이디어를 압축하는 데이터입니다.가 gzipoutputstream dude!는 것은 두 번의 처리량을 경우에는 CPU 유지할 수 있습니다.그것을 가능성이 있는 활용할 수 있습니다 지금 스탠다드 더블-중핵 기계,eh?

-Stosh

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