java - 在 Java 中编写和追加大文件的最佳方法是什么

标签 java web-services hadoop filesystems hdfs

我有一个 java 程序,它向网络服务发送一系列 GET 请求并将响应正文存储为文本文件。

我已经实现了以下示例代码(过滤了大部分代码以突出显示相关内容),它附加了文本文件并在 EOF 处作为新行写入。然而,该代码可以完美运行,但随着文件大小的增加,性能会受到影响。

数据的总大小将近 4 GB,并且平均附加大约 500 KB 到 1 MB 的数据。

do
{
    //send the GET request & fetch data as string
    String resultData = HTTP.GET <uri>;

    // buffered writer to create a file 
    BufferedWriter writer = new BufferedWriter(new FileWriter(path, true));

    //write or append the file
    writer.write(resultData + "\n");
}
while(resultData.exists());

这些文件每天创建并移动到 hdfs 以供 hadoop 使用和作为实时存档。有没有更好的方法来实现这一点?

最佳答案

1) 您每次都打开一个新的writer,而没有关闭之前的writer 对象。

2)不要每次写操作都打开文件,而是在循环前打开,循环后关闭。

BufferedWriter writer = new BufferedWriter(new FileWriter(path, true));
do{
          String resultData = HTTP.GET <uri>;
          writer.write(resultData + "\n");
}while(resultData.exists());
writer.close();

3) BufferedWriter 的默认缓冲大小是 8192 个字符,因为你有 4 GB 的数据,我会增加缓冲区大小,以提高性能,但同时确保你的 JVM 有足够的内存来保存数据。

BufferedWriter writer = new BufferedWriter(new FileWriter(path, true), 8192 * 4);
do{
          String resultData = HTTP.GET <uri>;
          writer.write(resultData + "\n");
}while(resultData.exists());
writer.close();

4) 由于您正在调用 GET 网络服务,因此性能还取决于 webservice响应 时间。

关于java - 在 Java 中编写和追加大文件的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30398924/

相关文章:

sql - 在SQL范围内选择

.net - 是否要在 Web 服务中返回数据集?

hadoop - 尽管我添加了 NoColumnFamily,但 HBase 行写入失败

azure - Azure Data Lake Analytics 数据库存储在哪里?

java - 如何在出队中查找并返回对象?

.net - Web 服务的依赖注入(inject)?

c# - WCF 中的泛型集合支持

Java - 用一种方法重绘 JPanel 2 次

java - 如何使用 SQL WHERE IN 中的项目列表/数组动态填充查询

java - JOptionPane 在 JPanel 中不能正常工作