2014-09-10 2 views
1

Итак, я прочитал несколько статей, но по сути, поскольку я хочу быстрый ввод-вывод, я хочу написать двойной массив в файл. Для этого мне нужно преобразовать его в массив байтов. К сожалению, это делает копирование данных.java Небезопасно, как интерпретировать память как другой тип объекта?

Так что я задавался вопросом о suing java Unsafe, возможно ли сделать байтовую переменную, указывающую на адрес массива double [], и просто интерпретировать данные как байты, а не удваивать? Мне не удалось найти нигде до сих пор такой пример, только снова, как использовать память для копирования, чтобы это сделать. Любые советы приветствуются!

+4

Вы можете использовать [ByteBuffer # asDoubleBuffer] (http://docs.oracle.com/javase/7/docs/api/java/nio/ByteBuffer.html#asDoubleBuffer()). Это позволяет работать с DoubleBuffer, который фактически меняет базовый ByteBuffer. – 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 использует Unsafe, но таким образом, который защищает вас.

+0

Только проблема, с которой это может встретиться, заключается в том, что вы не несете ответственность за код, создающий массив double [], например, когда вы используете другой код библиотеки ... Чем вы не можете это изменить. В моем случае это решение, возможно, лучше. Но мне все еще нравится этот @resueman, на который указывают силы Unsafe. Happy :) –

+0

@Belov Вы можете получить доступ к двойному [], как если бы он был байтом [], но на самом деле он не будет байтом [] или не будет в ByteBuffer. Вы можете сделать необработанную копию памяти, чтобы уменьшить работу, но она все равно будет копией. –

+1

Ну, в моем случае я не могу, так как позже я буду использовать double [] как двойной массив, но если вам нужно только сохранить его, не обращаясь к массиву снова, чем если вы посмотрите в статье, опубликованной в комментарии моего вопроса от resueman, вы можете преобразовать массив double [] в байт [] только путем изменения заголовков для типа и длины в сохраненном смещении в необработанной памяти. Было интересным упражнением хотя бы для меня :). –

Смежные вопросы