Java—在持久介质中存储整数的快速方法

Java—在持久介质中存储整数的快速方法,java,performance,file,optimization,io,Java,Performance,File,Optimization,Io,我需要在永久介质中存储一个整数。 我能想到的唯一选择是磁盘。。所以我试图在cwd中写一个文件 这必须尽快完成,并且需要假设文件确实在HD中同步,因为这必须是断电安全的 我已经尝试了很多方法,我不能得到少于200毫秒来写这个文件 我所尝试的: 以文件名写入内容: File file = new java.io.File(".1234567890"); file.createNewFile(); 使用FileOutputStream编写文件 fd = new FileOutputStream("

我需要在永久介质中存储一个整数。 我能想到的唯一选择是磁盘。。所以我试图在cwd中写一个文件

这必须尽快完成,并且需要假设文件确实在HD中同步,因为这必须是断电安全的

我已经尝试了很多方法,我不能得到少于200毫秒来写这个文件

我所尝试的:

  • 以文件名写入内容:

    File file = new java.io.File(".1234567890");
    file.createNewFile();
    
  • 使用FileOutputStream编写文件

    fd = new FileOutputStream(".flush", false);
    fd.write(1234567890);
    fd.flush();
    fd.getFD().sync();
    fd.close();
    
  • 我知道目标机器非常糟糕,但我正在尝试优化它。
    有什么建议吗?

    问题在于写入磁盘的速度。取消保留到磁盘的要求—这将花费不到1000分之一的时间

    如果要更快地写入实际磁盘,则需要更快的磁盘。e、 g.快速SSD可在50微秒内写入

    提高磁盘速度的唯一方法是将冗余副本发送到另一台机器,前提是两台机器不会同时死亡。这可能意味着使用独立的UPS电源

    若你们这样做,你们可以得到一条信息到另一个系统,往返时间不到20微秒


    正如@Thomas所建议的,您可以使用内存映射文件。虽然这不应该更快,但它确实让您能够更准确地控制持久化的内容。e、 g.不需要打开和关闭文件

    你可以提前

    RandomAccessFile memoryMappedFile = new RandomAccessFile(".flush", "rw");
    
    // 4K small buffer
    MappedByteBuffer buffer = memoryMappedFile.getChannel().map( FileChannel.MapMode.READ_WRITE, 0, 4 << 10);
    
    当数据被持久化到磁盘时,除了为了节省资源之外,不需要关闭


    因此,如果只对写入和强制进行计时,这是保存到磁盘所能做的最小值。

    问题在于写入磁盘的速度。取消保留到磁盘的要求—这将花费不到1000分之一的时间

    如果要更快地写入实际磁盘,则需要更快的磁盘。e、 g.快速SSD可在50微秒内写入

    提高磁盘速度的唯一方法是将冗余副本发送到另一台机器,前提是两台机器不会同时死亡。这可能意味着使用独立的UPS电源

    若你们这样做,你们可以得到一条信息到另一个系统,往返时间不到20微秒


    正如@Thomas所建议的,您可以使用内存映射文件。虽然这不应该更快,但它确实让您能够更准确地控制持久化的内容。e、 g.不需要打开和关闭文件

    你可以提前

    RandomAccessFile memoryMappedFile = new RandomAccessFile(".flush", "rw");
    
    // 4K small buffer
    MappedByteBuffer buffer = memoryMappedFile.getChannel().map( FileChannel.MapMode.READ_WRITE, 0, 4 << 10);
    
    当数据被持久化到磁盘时,除了为了节省资源之外,不需要关闭


    因此,如果只对写入和强制执行计时,这是保存到磁盘所能做的最小值。

    您可以尝试保持内存映射文件打开并附加整数。对于存储程序状态,请查看序列化完全同意@Thomas,这里有一个链接:@Thomas-内存映射文件是否安全关机,作为OP请求?您可以尝试保持内存映射文件打开并附加整数。对于存储程序状态,请查看序列化是否完全同意@Thomas,这里有一个链接:@Thomas-内存映射文件是否在OP请求时安全关机?