在本机内存中存储多个字节数组
Store multiple byte-arrays in native memory
我有固定长度的固定数量的字节数组 (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 中的数据,或者是否有其他方法可以解决我的问题?
看来您想在这里做的是将这些字节数组端到端地复制到某个内存段中。
你应该首先分配一个大的内存段,在循环中将其切片,然后一次将一个字节数组复制到一个切片中:
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,您最终在填充循环的最后一次迭代中创建了一个从未实际使用过的额外字节数组)。
我有固定长度的固定数量的字节数组 (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 中的数据,或者是否有其他方法可以解决我的问题?
看来您想在这里做的是将这些字节数组端到端地复制到某个内存段中。
你应该首先分配一个大的内存段,在循环中将其切片,然后一次将一个字节数组复制到一个切片中:
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,您最终在填充循环的最后一次迭代中创建了一个从未实际使用过的额外字节数组)。