铸造昂贵的操作?

时间:2010-12-17 13:44:58

标签: java file

方案

  • 我正在解析一个大文件(字符文件)。例如.csv文件(不完全是我的情况)
  • 我无法将整个文件保存在内存中。所以我必须实施一个缓冲策略。
  • 我想构建一个通用的处理程序,它将在内存中保持一定数量的行(如Strings)。如果需要,此处理程序会在删除不需要的行时获取其他行。
  • 通过这个处理程序,我将构建一个解析器,将线转换为Java对象并对这些对象进行更改。完成更改后(更新对象上的某些字段)将更改保留回文件。

我应该

  • 我应该将缓冲区直接保存为对象(进行单个转换),而不是将缓冲区保留为字符串数组?或...
  • 将缓冲区保持为行,每次我需要对缓冲区进行操作,将信息转换为正确的对象,进行更改,将更改保留回文件。顺序操作需要补充演员。

我必须保持简单。 有什么建议吗?

4 个答案:

答案 0 :(得分:8)

转换不会更改对象占用的内存量。它只是改变了运行时类型。

如果你可以按行进行这些操作,那么只需在你读取一行的循环内立即进行操作。

while ((line = reader.readLine()) != null) {
    line = process(line);
    writer.println(line);
}

这样你每次只能在Java内存中只有一行而不是整个文件。

或者,如果您需要基于整个CSV文件执行这些操作(即,这些操作依赖于所有行),那么您最有效的选择是以真实的方式导入CSV文件SQL数据库然后使用SQL语句来更改数据,然后再将其导出到CSV文件。

答案 1 :(得分:3)

我建议使用MappedByteBuffer(来自NIO),您可以使用它来读取太大而无法放入内存的文件。 它只将文件的一个区域映射到内存中;一旦你读完这个区域(比如说,前10k),就要映射下一个区域,依此类推,直到你读完整个文件。 内存效率高,易于实现。

答案 2 :(得分:2)

Java Casts:喜欢

Object a = new String();
String b (String) a;

并不昂贵。 - 无论你是否施放弦乐或任何其他类型。

答案 3 :(得分:1)

你真正的价值添加是将每行读作一个字符串,这在Java中很容易。在它的字符串之后,用

分割每个逗号上的字符串是微不足道的

String[] row = parsedRow.split(",");

对于数组中的每个值,您将拥有一个String,然后可以对其进行操作。