0

我有一个空格分隔的数据文件,其中包含以下格式的 450 万个条目

CO_1 A 0 0 0 0 1

CO_2 A 0 0 0 0 1

该数据文件用作自组织映射 (SOM)算法的输入,该算法迭代该文件 100 次(在我的情况下)。

我使用以下 readFile 函数将文件完全复制到临时字符串中,并将字符串传递给 SOM 算法。

public String readFile()
{
    String temp = "";

    try
    {
        FileReader file = new FileReader(FILE_LOCATION);
        BR = new BufferedReader(file);
        String strLine = null;

        while((strLine = BR.readLine()) != null)
        {
            temp += strLine + "\n";
        }
    }
    catch(Exception e)
    {
        
    }
    
    return temp;
}

我怎么感觉上述方法给内存带来了沉重的负担并减慢了可能导致内存溢出的迭代。目前,我在分配了 30GB 内存的集群中运行此代码,并且执行甚至没有完成大约 36 个小时的单次迭代。

我无法部分读取文件(如以行块的形式),因为一旦完成初始块,SOM 将不得不轮询数据,这可能会导致更复杂的情况。

任何想法我可以如何改进这一点,以便我可以成功地迭代 450 万个条目 100 次。

编辑

仅使用上述方法将整个文件读入字符串一次。然后在 100 次迭代中使用字符串变量。但是,每次使用字符串标记器来处理文件中的每一行 * 迭代次数。

4

4 回答 4

2

永远不要将字符串连接用于这种目的。为此,请使用class
而不是。 考虑以下示例: StringStringBuffer

public StringBuffer readFile()
{
    StringBuffer tempSB = new StringBuffer();

    try
    {
        FileReader file = new FileReader(FILE_LOCATION);
        BR = new BufferedReader(file);
        String strLine = null;

        while((strLine = BR.readLine()) != null)
        {
            tempSB.append(strLine);
            tempSB.append("\n");
        }
    }
    catch(Exception e)
    {

    }

    return temp;
}  

这将节省您的堆内存。

于 2014-02-22T12:31:13.410 回答
2

我想补充其他答案。尽管我认为您应该将数据存储在比字符串更有效的数据结构中,但我认为您的代码速度慢可能还有另一个原因。

由于您的文件大小似乎约为 100 MB,因此您的代码可能会变慢,因为 Eclipse 没有为其分配足够的堆空间。尝试添加以下标志:

-Xmx4G

这将为您的代码提供 4 GB 的堆空间来使用。为此,在 Eclipse 中转到:

// Run -> Run Configurations -> <Select your main class on the left>
// -> <Select the 'Arguments' tab>
// -> <Add the string "-Xmx4G" to the 'VM arguments' text area>

这可能会加快速度!

于 2014-02-22T13:29:53.060 回答
0

使用 String += 读取文件非常昂贵。我建议您将条目解析为数据结构,这大约需要 1-10 秒。反复迭代应该花费不到一秒钟的时间。450 万个条目,每个条目使用 110 个字节,应该使用大约 0.5 GB,对于更复杂的结构可能需要 1 GB。这应该不足以担心。

于 2014-02-22T12:29:21.857 回答
0

如果您需要解析 txt串行文件并能够随机读取它,请使用持久存储,如SQLDB 或no-SQL一个甚至Lucene Search Engine. 这将为您带来以下好处:

  • 您不必将整个文件加载到 RAM 中
  • 您可以使用流处理->逐行读取文件并仅将实际行保留在RAM中
  • 源文件的解析和持久化会花费更多时间,但随机访问会更快。
  • 您甚至可以在多个线程中独立解析和读取数据
于 2014-02-22T12:34:26.967 回答