chronicle-bytes 引发段错误
chronicle-bytes raising a segfault
按照 中接受的解决方案,我现在已经按照接受的答案以相同的方式设置了我的代码。
我正在生成 1,000,000 个对象,我将这些对象写入 MappedFile,我希望每个对象都能够管理自己的 reads/writes 到 MappedFile:
public class DataObject {
public static final int LENGTH = 12;
private static final int A_OFFSET = 0;
private static final int B_OFFSET = 4;
private PointerBytesStore bytes;
public DataObject(long memoryAddress) {
this.bytes = new PointerBytesStore();
this.bytes.set(memoryAddress, LENGTH)
}
public int getA() {
return this.bytes.readInt(A_OFFSET);
}
public void setA(int a) {
this.bytes.writeInt(a);
}
...
}
然后我创建 DataObject 使用:
MappedFile file = MappedFile.mappedFile(new File(tmpfile), 64 << 10);
MappedBytes mappedBytes = MappedBytes.mappedBytes(mappedFile);
int offset = 0;
List<DataObject> myList = new ArrayList<>();
for(i = 0; i < 1000000; i++) {
int address = mappedBytes.addressForRead(offset);
myList.add(new DataObject(address));
offset += DataObject.LENGTH;
}
我发现,使用与上述类似的代码,当我达到约 100,000 个对象时,chronicle-bytes 会生成段错误。段错误往往在尝试读取或写入 PointerBytesStore 时发生,但不可预测。
这是 chronicle-bytes 中的错误还是我滥用了库?任何 help/suggestions/recommendations 将不胜感激。
MappedFile 一次映射到内存块中。除非您通过保留它们来保留这些块,否则内存将在不再使用它们时被释放。
一种解决方案是使用大块,这样您就只使用一个块。
另一种方法是 to.use Chronicle Map,因为它将根据需要管理内存。
按照
我正在生成 1,000,000 个对象,我将这些对象写入 MappedFile,我希望每个对象都能够管理自己的 reads/writes 到 MappedFile:
public class DataObject {
public static final int LENGTH = 12;
private static final int A_OFFSET = 0;
private static final int B_OFFSET = 4;
private PointerBytesStore bytes;
public DataObject(long memoryAddress) {
this.bytes = new PointerBytesStore();
this.bytes.set(memoryAddress, LENGTH)
}
public int getA() {
return this.bytes.readInt(A_OFFSET);
}
public void setA(int a) {
this.bytes.writeInt(a);
}
...
}
然后我创建 DataObject 使用:
MappedFile file = MappedFile.mappedFile(new File(tmpfile), 64 << 10);
MappedBytes mappedBytes = MappedBytes.mappedBytes(mappedFile);
int offset = 0;
List<DataObject> myList = new ArrayList<>();
for(i = 0; i < 1000000; i++) {
int address = mappedBytes.addressForRead(offset);
myList.add(new DataObject(address));
offset += DataObject.LENGTH;
}
我发现,使用与上述类似的代码,当我达到约 100,000 个对象时,chronicle-bytes 会生成段错误。段错误往往在尝试读取或写入 PointerBytesStore 时发生,但不可预测。
这是 chronicle-bytes 中的错误还是我滥用了库?任何 help/suggestions/recommendations 将不胜感激。
MappedFile 一次映射到内存块中。除非您通过保留它们来保留这些块,否则内存将在不再使用它们时被释放。
一种解决方案是使用大块,这样您就只使用一个块。
另一种方法是 to.use Chronicle Map,因为它将根据需要管理内存。