Java中的性能/内存,用于在多个文件上生成数据

Java中的性能/内存,用于在多个文件上生成数据,java,performance,memory,Java,Performance,Memory,问题是: 1.需要为3个文件生成1.000.000个条目/文件(csv_扩展名)。 1.3个文件之间的数据连接如下: 文件1-会话 文件2-工作流程 文件3-步骤 文件2需要包含文件1中生成的会话ID字段,文件3需要文件2中生成的工作流ID字段,以便它们之间存在链接。 会话包含工作流,工作流包含步骤 如何在生成时做到这一点而不影响性能和内存 谢谢大家! 您应该使用流(输入和输出)来处理文件(大数据),而不会占用太多内存 一篇好文章 简化示例: FileReader in = null; Fil

问题是: 1.需要为3个文件生成1.000.000个条目/文件(csv_扩展名)。 1.3个文件之间的数据连接如下: 文件1-会话 文件2-工作流程 文件3-步骤

文件2需要包含文件1中生成的会话ID字段,文件3需要文件2中生成的工作流ID字段,以便它们之间存在链接。 会话包含工作流,工作流包含步骤

如何在生成时做到这一点而不影响性能和内存


谢谢大家!

您应该使用
(输入和输出)来处理文件(大数据),而不会占用太多内存

一篇好文章

简化示例:

FileReader in = null; 
FileWriter out = null; 
try { 
    in = new FileReader("input.txt"); 
    out = new FileWriter("output.txt"); 
    int c; 
        while ((c = in.read()) != -1) { 
            out.write(c); 
        } 
}
finally { 
    if (in != null) { 
        in.close(); 
    } 
    if (out != null) { 
        out.close(); 
    } 
}

您应该使用
(输入和输出)来处理文件(大数据),而不会占用太多内存

一篇好文章

简化示例:

FileReader in = null; 
FileWriter out = null; 
try { 
    in = new FileReader("input.txt"); 
    out = new FileWriter("output.txt"); 
    int c; 
        while ((c = in.read()) != -1) { 
            out.write(c); 
        } 
}
finally { 
    if (in != null) { 
        in.close(); 
    } 
    if (out != null) { 
        out.close(); 
    } 
}

当然,做任何事情都会对性能/记忆产生影响,但无论如何

这个问题最明显、最棘手的部分是CSV文件。它是纯文本格式,可以有效地将输出的每个字段呈现为大小可变的块。如果不能利用关于批量写入或读取内存块的固定大小假设,则很难在文件I/O(或任何类型的内存I/O)中获得最佳性能

相比之下,比如说,将一百万个连续的浮点值输出到一个二进制文件,每个二进制文件将写入一个32位块。这可能发生得非常快(例如毫秒)

除此之外,以纯文本形式输出还需要在某个地方进行词法转换,即使不考虑内存中的情况,这也会增加CPU的压力

在分析之前,我们不应该深入细节(大多数微观优化最好保存下来,以便在测量后再应用),在这里最初利用的最有效的东西可能是并发性

虽然存在这些文件间依赖关系,但临时存储在内存中的一百万个条目应该相对便宜(前提是每个条目不会聚集一百个元素或类似的内容)。您应该能够在易失性内存中计算和存储这些相互依赖的数据,而不涉及直接的文件间依赖关系

由于顺序依赖性,计算相互依赖的数据实际上是一个串行问题,因此必须在单个线程中执行(除非您可以在每个条目级别上跨会话/工作流/步骤同时执行此操作,此时您可以并行计算条目)

一旦在易失性内存中进行了计算,就可以并行化这三个文件的输出


除此之外,在这个初始阶段,可能只是确保您为I/O使用一个高效的API,并为存储在易失性内存中的内容使用一个具有良好引用位置的合理紧凑的数据表示。

自然地做任何事情都会对性能/内存产生影响,但无论如何

这个问题最明显、最棘手的部分是CSV文件。它是纯文本格式,可以有效地将输出的每个字段呈现为大小可变的块。如果不能利用关于批量写入或读取内存块的固定大小假设,则很难在文件I/O(或任何类型的内存I/O)中获得最佳性能

相比之下,比如说,将一百万个连续的浮点值输出到一个二进制文件,每个二进制文件将写入一个32位块。这可能发生得非常快(例如毫秒)

除此之外,以纯文本形式输出还需要在某个地方进行词法转换,即使不考虑内存中的情况,这也会增加CPU的压力

在分析之前,我们不应该深入细节(大多数微观优化最好保存下来,以便在测量后再应用),在这里最初利用的最有效的东西可能是并发性

虽然存在这些文件间依赖关系,但临时存储在内存中的一百万个条目应该相对便宜(前提是每个条目不会聚集一百个元素或类似的内容)。您应该能够在易失性内存中计算和存储这些相互依赖的数据,而不涉及直接的文件间依赖关系

由于顺序依赖性,计算相互依赖的数据实际上是一个串行问题,因此必须在单个线程中执行(除非您可以在每个条目级别上跨会话/工作流/步骤同时执行此操作,此时您可以并行计算条目)

一旦在易失性内存中进行了计算,就可以并行化这三个文件的输出


除此之外,在这个初始阶段,可能只是确保您使用一个有效的API进行I/O,并确保您在易失性内存中存储的数据具有良好的引用位置,并且数据表示合理紧凑。

就性能而言,您正在对3个不同的文件进行大量I/O操作

如果您只使用普通的或,这可能会减慢处理速度。 主要原因是,您只需将小块数据(CSV的一行)写入磁盘,但通常情况下会将其写入磁盘

因此,我建议使用缓冲区来加速较慢的I/O,方法是写入较大的数据块,但不经常使用或包装or

合理的缓冲区大小可能是64 KB。 假设硬盘上的群集大小为4KB,这将缓存16个数据块,然后立即将它们写入磁盘


就内存影响而言,您应该确保在每个处理步骤中只处理一条记录,然后将链接的记录写入磁盘,而不保留这些记录供以后使用。

就性能而言,您需要