2014-09-10 1 views
1

그래서 몇 가지 기사를 읽었지만 본질적으로 빠른 I/O를 원하기 때문에 파일에 이중 배열을 쓰고 싶습니다. 이렇게하려면 바이트 배열로 변환해야합니다. 불행히도 이것은 데이터 복사를 만듭니다.java 메모리를 다른 유형의 객체로 해석하는 방법 안전하지 않습니까?

그래서 안전하지 않은 자바를 고소하고 싶습니다. 이중 [] 배열의 주소를 가리키는 byte [] 변수를 만들 수 있으며 데이터를 double 형이 아닌 바이트로 해석 할 수 있습니까? 나는 지금까지 어디에서나 그러한 예를 발견 할 수 없었다. 단지 이것을하기 위해 메모리를 복사하는 방법 만 다시 생각해 보았다. 모든 조언을 부탁드립니다!

+4

[ByteBuffer # asDoubleBuffer] (http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#asDoubleBuffer())를 사용할 수 있습니다. 이렇게하면 기본 ByteBuffer를 실제로 변경하는 DoubleBuffer로 작업 할 수 있습니다. – maba

+1

이 기사는 원하는대로하고있는 것처럼 보입니다. http://java-performance.info/object-assignments-type-conversions-on-the-low-level-in-java/ – resueman

+0

이식성 (32/64 비트)을 원하면 Java NIO와 함께 갈 것입니다. FileChannel, ByteBuffer (직접 바이트 버퍼 일 수 있음) 및 DoubleBuffer를 사용하십시오. – maba

답변

4

ByteBuffer로 시작하면 참조를 유지하고 서로 바꿔서 사용할 수 있습니다.

ByteBuffer bb = ByteBuffer.allocateDirect(8 * n_doubles); 
DoubleBuffer db = bb.asDoubleBuffer(); 

당신은 하나에 읽기/쓰기와 같은 메모리가 사용되는 byte의 또는 double들로 볼 수 없습니다.

파일을 추가로 복사하지 않으려면 메모리 맵핑 된 영역을 사용할 수 있습니다.

BTW : ByteBuffer는 안전하지는 않지만 사용자를 보호합니다.

+0

다른 라이브러리 코드를 사용할 때와 같이 double [] 배열을 생성하는 코드에 대한 책임이 없으면 문제가 발생할 수 있습니다. 변경할 수없는 것입니다. 제 경우에는 해결책이 될 수 있습니다. 그러나 나는 여전히 @resueman이 가리키는 것을 좋아하는데, Unsafe의 힘을 보여줍니다. 해피 :) –

+0

@Belov double []에 액세스 할 수 있습니다. byte [] 였지만 실제로는 byte []가 아니거나 ByteBuffer에 있습니다. 작업을 줄이기 위해 원시 메모리 복사본을 만들 수는 있지만 여전히 사본이됩니다. –

+1

글쎄, 제 경우에는 double 배열로 double []을 나중에 사용할 것이기 때문에 배열을 다시 액세스하지 않고 저장하면됩니다. 코멘트 resueman에 의해 내 질문에, 당신은 원시 메모리에서 저장된 오프셋의 유형과 길이에 대한 헤더를 변경하여 double [] 배열을 byte []로 변환 할 수 있습니다. 적어도 나를 위해 흥미로운 운동이었습니다 :). –