web服务—用java编写和附加大文件的最佳方法是什么

rbpvctlc  于 2021-06-02  发布在  Hadoop
关注(0)|答案(2)|浏览(301)

我有一个java程序,它向Web服务发送一系列get请求,并将响应正文存储为文本文件。
我已经实现了下面的示例代码(过滤了大量代码以突出显示相关的内容),它附加了文本文件并在eof处作为新行写入。然而,代码工作得很好,但是随着文件的增大,性能会受到影响。
数据的总大小几乎为4GB,平均为500KB到1MB。

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使用和作为实时存档。有没有更好的方法来实现这一点?

bvhaajcl

bvhaajcl1#

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个字符,因为您有4GB的数据,我会增加缓冲区大小,以提高性能,但同时确保您的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 web服务调用,因此性能取决于 response 时间 webservice 也。

mpbci0fu

mpbci0fu2#

根据这个答案,filewriter和bufferedwriter之间的java区别是,您现在所做的是低效的。
您提供的代码不完整。括号不见了,不是吗 close 对作者的陈述。但如果我能正确理解 resultData 打开一个新的缓冲写入程序并调用write一次。这意味着您应该使用 FileWriter 直接地说,因为你是这样做的,缓冲区只是一个开销。
如果您希望它在一个循环中获取数据并将它们写入一个文件,那么您应该这样做

try( BufferedWriter writer = new BufferedWriter(new FileWriter("PATH_HERE", true)) ) {
    String resultData = "";

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

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

    } while(resultData != null && !resultData.isEmpty());

} catch(Exception e) {
    e.printStackTrace();
}

上面使用try with资源,它将处理在退出后关闭writer的问题 try 阻止。这在Java7中可用。

相关问题