Java Panama: хранить несколько байтовых массивов в собственной памяти
У меня есть фиксированное количество байтовых массивов (
byte[]
) фиксированной длины, которую я хочу сохранить в собственной памяти (а затем получить). Однако я не слишком уверен, как я могу напрямую хранить несколько массивов в MemorySegment.
Я знаю, что потенциально могу создать один большой MemorySegment и инициализировать его элемент за элементом, но я полагаю, что эта стратегия будет медленной и сделает поиск более проблематичным (возможно?).
В документации по API я наткнулся на абстракцию SegmentAllocator, которая, кажется, решает мою проблему с распределением, но я не понимаю, как получить выделенные данные с помощью этого SegmentAllocator.
try(ResourceScope scope = ResourceScope.newConfinedScope()){
byte[] data = objToByteArray(someClass.getDeclaredConstructor().newInstance()); //suppose data is always of constant length
SegmentAllocator alloc = SegmentAllocator.arenaAllocator(numOfArrays* data.length, scope);
for(int i = 0; i < numOfArrays; i++){
alloc.allocateArray(MemoryLayouts.JAVA_BYTE, data);
data = objToByteArray(someClass.getDeclaredConstructor().newInstance());
}
//how can I access the arrays in alloc?
}catch(Exception e){
e.printStackTrace();
}
Есть ли способ получить доступ к данным в SegmentAllocator или, возможно, есть другой подход к решению моей проблемы?
1 ответ
Похоже, что вы хотите здесь скопировать эти байтовые массивы из конца в конец в какой-то сегмент памяти.
Вы должны начать с выделения большого сегмента памяти, разрезать его в цикле, а затем скопировать массив байтов в сегмент за раз:
try (ResourceScope scope = ResourceScope.newConfinedScope()) {
byte[] data = objToByteArray(someClass.getDeclaredConstructor().newInstance()); //suppose data is always of constant length
long stride = data.length;
// allocate segment
MemorySegment segment = MemorySegment.allocateNative(numOfArrays * stride, scope);
// copy arrays to segment
for (int i = 0; i < numOfArrays; i++) {
MemorySegment slice = segment.asSlice(i * stride, stride);
slice.copyFrom(MemorySegment.ofArray(data));
data = objToByteArray(someClass.getDeclaredConstructor().newInstance());
}
// read arrays back
for (int i = 0; i < numOfArrays; i++) {
MemorySegment slice = segment.asSlice(i * stride, stride);
data = slice.toByteArray();
System.out.println(Arrays.toString(data));
}
} catch (Exception e) {
e.printStackTrace();
}
(также, FWIW, вы в конечном итоге создаете дополнительный массив байтов на последней итерации цикла заполнения, который фактически никогда не используется).