几天来,我一直在寻找解决我遇到的一些关键问题的方法,但我还没有找到一个很好的答案。
我正在着手一个学术(/learning)项目,该项目涉及定期阅读3-50 my的纯文本文件,并最终跨越数百万条记录(我目前的记录是80万条)。
假设文件不能被split()分成块,那么在函数之间传递这个块的最好方法是什么?按值传递会让我想到(我相信还会看到)将一个50 me的文件传递给一个函数,并返回一个20-30 me的结果集,这意味着我浪费了超过100 me的内存,只是将等待在GC中回收的文件传递出去。(从技术上讲,可以将文件拆分(),但那些拆分()的文件有时都大10 be,处理过程中必须保存每个文件)
我最近对我的整个项目做了重大的修改,这次我想设计处理部分更好的。以前的方法主要是读取和处理驱动程序本身中的数据--没有数据容器。当我试图使用数据容器时,我得到了类似的结果。下面是我使用的第一个方法:
然而,当我读到时,我可能会分裂,但是,即使这些分片的大小都可以是5MB (或更多),而且我需要将其中的大部分保存在内存中,直到文件完成处理(如果步骤3改变了步骤4的工作方式)。更糟糕的是,一些输入的readLine()本身可能只有1-2MB长(在\n之前)。
那么,什么样的设计策略最适合处理这些巨大的输入文件和巨大的字符串呢?
发布于 2014-03-10 16:32:46
按值传递会让我想到(我相信还会看到)将一个50 me的文件传递给一个函数,并返回一个20-30 me的结果集,这意味着我浪费了超过100 me的内存,只是将等待在GC中回收的文件传递出去。
不正确。Java通过值传递引用,而不是传递整个String。我要做的是传递(引用)字符串以及要处理的字符串部分的开始和结束索引。
void read()
{
String input = /*your code here*/;
process(input, 37, 17576);
}
process(String input, int startIndex, int endIndex)
{
/*your code here, e.g.
for(int i = startIndex; i < endIndex; i++)
{
//do stuff
}*/
}此外,如果read和process在同一个类中,则只需将字符串设置为类字段:
String input;
void read()
{
input = /*your code here*/;
process(37, 17576);
}
process(int startIndex, int endIndex)
{
/*your code here, e.g.
for(int i = startIndex; i < endIndex; i++)
{
//do stuff
}*/
}https://stackoverflow.com/questions/22305493
复制相似问题