首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确处理大型输入和处理字符串

正确处理大型输入和处理字符串
EN

Stack Overflow用户
提问于 2014-03-10 16:15:24
回答 1查看 44关注 0票数 0

几天来,我一直在寻找解决我遇到的一些关键问题的方法,但我还没有找到一个很好的答案。

我正在着手一个学术(/learning)项目,该项目涉及定期阅读3-50 my的纯文本文件,并最终跨越数百万条记录(我目前的记录是80万条)。

假设文件不能被split()分成块,那么在函数之间传递这个块的最好方法是什么?按值传递会让我想到(我相信还会看到)将一个50 me的文件传递给一个函数,并返回一个20-30 me的结果集,这意味着我浪费了超过100 me的内存,只是将等待在GC中回收的文件传递出去。(从技术上讲,可以将文件拆分(),但那些拆分()的文件有时都大10 be,处理过程中必须保存每个文件)

我最近对我的整个项目做了重大的修改,这次我想设计处理部分更好的。以前的方法主要是读取和处理驱动程序本身中的数据--没有数据容器。当我试图使用数据容器时,我得到了类似的结果。下面是我使用的第一个方法:

  1. 将整个3-50 MB+文件读取为字符串。
  2. Regex/拆分为4-15块(由文件中的类XML标记确定)
  3. 将1-3块块传递给函数A(查找某些数据)
  4. 将4-5个块传递给函数B(查找函数A中不存在的不同数据)
  5. 在驱动程序函数中收集结果
  6. 将结果集拼接在一起,并写入磁盘(我现在知道应该创建并追加)。

然而,当我读到时,我可能会分裂,但是,即使这些分片的大小都可以是5MB (或更多),而且我需要将其中的大部分保存在内存中,直到文件完成处理(如果步骤3改变了步骤4的工作方式)。更糟糕的是,一些输入的readLine()本身可能只有1-2MB长(在\n之前)。

那么,什么样的设计策略最适合处理这些巨大的输入文件和巨大的字符串呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-10 16:32:46

按值传递会让我想到(我相信还会看到)将一个50 me的文件传递给一个函数,并返回一个20-30 me的结果集,这意味着我浪费了超过100 me的内存,只是将等待在GC中回收的文件传递出去。

不正确。Java通过值传递引用,而不是传递整个String。我要做的是传递(引用)字符串以及要处理的字符串部分的开始和结束索引。

代码语言:javascript
复制
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
    }*/
}

此外,如果readprocess在同一个类中,则只需将字符串设置为类字段:

代码语言:javascript
复制
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
    }*/
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22305493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档