我有一个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使用和作为实时存档。有没有更好的方法来实现这一点?
2条答案
按热度按时间bvhaajcl1#
1) 您正在打开一个新的
writer
每次,不关闭前一个writer
对象。2) 不要为每个写操作打开文件,而是在循环之前打开它,在循环之后关闭它。
3) 默认缓冲区大小
BufferedWriter
是8192个字符,因为您有4GB的数据,我会增加缓冲区大小,以提高性能,但同时确保您的jvm有足够的内存来保存数据。4) 由于您正在进行get web服务调用,因此性能取决于
response
时间webservice
也。mpbci0fu2#
根据这个答案,filewriter和bufferedwriter之间的java区别是,您现在所做的是低效的。
您提供的代码不完整。括号不见了,不是吗
close
对作者的陈述。但如果我能正确理解resultData
打开一个新的缓冲写入程序并调用write一次。这意味着您应该使用FileWriter
直接地说,因为你是这样做的,缓冲区只是一个开销。如果您希望它在一个循环中获取数据并将它们写入一个文件,那么您应该这样做
上面使用try with资源,它将处理在退出后关闭writer的问题
try
阻止。这在Java7中可用。