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, вы в конечном итоге создаете дополнительный массив байтов на последней итерации цикла заполнения, который фактически никогда не используется).

Другие вопросы по тегам