我有一个CSV文件,其中包含客户信息,每行一位客户。
该CSV文件的大小约为170,000行。
该应用程序首先逐行分析整个文件,并将每行作为客户对象保存到ArrayList
中。这意味着列表的大小也将在170k的数量级。
代码如下:
final class CustomerInfoLineProcessor implements LineProcessor<CustomerInfo> {
...
@Override
public boolean processLine(final String line) {
parseLine(line);
return true;
}
private void parseLine(final String line) {
try {
if (!line.trim().isEmpty()) {
//do job
}
} catch (final RuntimeException e) {
handleLineError(e.getClass().getName() + ": " + e.getMessage(), e, lineStatus);
}
}
...
}
间歇地发现解析过程在中间异常结束。没有引发错误或运行时异常。整个过程也没有停止。该应用根据ArrayList
内部的内容继续做进一步的工作。
一开始,我认为文件中某些位置可能隐藏了一些不可见的字符,这导致进程提前退出。但是,在我的测试机上,同一应用程序对同一文件进行了无问题测试后,排除了这种可能性。
第二个猜测是:内存设置-Xmx256m太小,因此我将其更改为甚至更小的-Xmx128m。该应用程序立即抛出OutOfMemoryError
,该应用程序自动终止。它暗示-Xmx256m的内存使用似乎不是问题。
我还没有考虑过其他原因吗?
答案 0 :(得分:-1)
这是找到的问题。 *每天早晨,客户的应用程序将csv文件通过ftp通过FTP发送给我们; *然后file_sync应用程序开始解析cvs文件; *在启动file_sync应用程序时,有时cvs文件的ftp传输未完成。它引起了问题。
因此,解决方案是在启动file_sync应用之前,确保csv文件未被其他进程打开。