Java长任务 - 它是否停止写入文件?

时间:2010-03-16 19:29:38

标签: java

我正在将大量数据写入文件,在关注文件的同时最终停止增长。

基本上我的任务是从数据库中获取信息,并打印出A列中的所有值 - 尽管它们是否是重复的值......

由于数据库表有很多行,并且数据库表在我的网络中,因此需要数天时间才能完成。因此我担心由于文件没有增长,它实际上不再写入文件了。

- 这很奇怪,我的代码中没有“catch”,所以如果写入文件时出现问题,是不是会抛出错误?!

我应该让任务完成(从今天开始估计2-3天),还是还有其他我不知道的事情在这里让我的应用程序不写入文件?!

我的算法就是这样的

Declare file
Create new file
Open file for writing (using bufferedwriter)
get database connection
get resultset from database
for each row in the resultset 
   - write column "A" to file
   - if row# % 100000 then write to screen "completed " + row# + " rows"
when no more rows exist
close file
write to screen - "completed"

(使用Windows 7)

3 个答案:

答案 0 :(得分:2)

您是否尝试过stream.flush()方法? (将至少通过stream.close()调用

- >所以试试'定期',看看是否有帮助。

警告:如果您过于频繁地冲洗,则会导致性能下降

E.g。试试

if rowNumber % 100000 then flush

答案 1 :(得分:1)

您可能遇到过数据库的一部分,其中没有重复项,查询已停止响应(或超时)或其他一些结论。您的问题中没有足够的数据可以真正回答。

一些建议:

  1. 划分查找重复项的任务(或许db中有唯一的行标识符)。这将允许您判断剩余时间,并在每个步骤完成后以字节大小块通知
  2. 添加记录。大量的日志记录,报告发生了什么以及何时进行。至少登录屏幕,然后你只需要注意屏幕上的移动
  3. 如果出来的数据很大,则写入多个文件。将块写入文件,以便在等待时可以使用块。
  4. 尝试并优化该查询以减少运行时间,或者预先确定结果(到临时表),然后在可能的情况下执行该操作。如果出现故障,它将更容易恢复。

答案 2 :(得分:0)

您未包含有关您的操作系统的详细信息。根据操作系统,有多种方法可以确定进程的打开文件(在UNIX上尝试:lsof),反之亦然,即使用文件的进程(UNIX:fuser)。

我还注意到你在你的例子中说过“/ n”,希望你的意思是“\ n”。反斜杠是换行的正确逃脱。如果没有,那可能是一个问题,因为IO层通常不会刷新,直到看到换行符或缓冲区填充。出于这个原因,请考虑使用WriteLine()而不是Write(),或者将flush作为另一个建议调用。

编辑:对于Windows,请尝试Process Explorer:http://technet.microsoft.com/en-us/sysinternals/bb896653.aspx