2012-08-09 37 views
0

我有一个程序在平面文件中写入大约8百万行数据。截至目前,该计划呼吁bufferedwriter.write每个记录的,我正打算大量写有以下策略以文件顺序写入vs批量写入

  1. 保持一个数据结构(我用数组)来保存记录的具体数量。
  2. 使用数组在文件中写入详细信息。这里是代码片段(数组是存储记录和阈值计数的数组的名称是编写过程开球)

    if (array.length==thresholdCount) { 
        writeBulk(array); 
    } 
    
    public void writeBulk(String[] inpArray) { 
        for (String line:inpArray) { 
          if (line!=null) { 
           try { 
            writer.write(line +"\n"); 
           } catch (IOException e) { 
            e.printStackTrace(); 
           } 
          } 
        } 
    
    } 
    

但是我没有看到太多的性能提升。我想知道是否有办法确定最佳阈值计数? 我还打算进一步调整代码,以便将数组中的每个元素存储为n个记录的串联,然后调用批量方法。例如,长度为5000的数组实际上将包含50000条记录,从而数组中的每个索引都包含10条记录。然而在此之前,我需要专家意见。

+1

为什么你会期望在所描述的场景下性能有所提高? – 2012-08-09 21:25:34

回答

0

写入文件在被推送到磁盘之前已经以类似的方式被缓存(除非你刷新 - 实际上并不总是这么做)。因此,预写缓冲写入操作不会加速整个过程。注意:某些IO类尝试通过在每次写入后插入刷新请求来立即执行写操作。对于那些特殊情况,预缓冲有时可以提供帮助,但通常您只需首先使用缓冲版本的类,而不是手动缓冲自己。

如果您正在写入文件末尾以外的地方,那么您可以看到一个改进,因为写入文件中间不需要复制已经刷新的条目的内容,磁盘。

+0

感谢您的详细信息。但是,当我使用5000,10000或20000的不同大小尺寸时,我确实看到了一些性能提升(范围为2至5%),因此想知道是否有方法猜测某些数量写作。我打算做的另一件事是有一个工作线程处理一个指定大小的数组(这恰好与阈值计数相同)。这应该会提高我猜测的性能,但我还没有确定,在我的开发环境中,使用线程写入比顺序写入要慢。 – user1588737 2012-08-09 21:50:16

+0

@ user1588737对于大块(大于8KB),您可能会看到一点小小的改进,因为它可以一个接一个地写入多个块,而无需等待磁盘旋转。您也可以通过留下部分块来减慢速度。这样做你不会得到可靠的加速。将写入任务推送到另一个线程不会加速写入磁盘进程,但生成需要写入的字符串可以在另一个线程中完成。这只会提高整体性能,如果您在主线程等待写入时有一些有用的功能。 – Pyrce 2012-08-09 21:58:09