编年史字节引发段错误

时间:2018-10-22 13:33:05

标签: chronicle chronicle-bytes

按照chronicle-bytes shared DirectBytesStores中接受的解决方案,我现在以与接受的答案相同的方式设置代码。

我正在生成1,000,000个对象,并将它们写出到MappedFile中,我希望每个对象都能够管理自己对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个对象时,编年字节会生成段错误。尝试读取或写入PointerBytesStore时,段错误往往会发生,但无法预测。

这是编年史中的错误吗?还是我在滥用该库?任何帮助/建议/建议将不胜感激。

1 个答案:

答案 0 :(得分:0)

MappedFile一次映射到大块内存中。除非您通过保留来保留这些块,否则在不再使用它们时将释放内存。

一种解决方案是使用大块,所以您永远只使用一个块。

另一种方法是使用编年史地图,因为它将根据需要管理内存。