如何读取大的avro文件,并将整个文件加载到内存中。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何读取大的avro文件,并将整个文件加载到内存中。相关的知识,希望对你有一定的参考价值。

我想读取大小为2.5GB的大型avro文件。目前,我正在使用

new DataFileReader<>(readFile, userDatumReader);

将整个2.5GB的文件加载到内存中。

有什么办法可以读取大的avro文件,并将完整的文件加载到内存中?

答案

使用DataFileReader几乎可以肯定 将完整的文件加载到内存中。

DatumReader<GenericRecord> datumReader = new GenericDatumReader<>();
try (DataFileReader<GenericRecord> dataFileReader = new DataFileReader<>(file, datumReader)) {
  while (dataFileReader.hasNext()) {
    GenericRecord datum = dataFileReader.next(null)
    processRecord(datum);
    // Make sure you're not keeping a reference
    // to datum after it's been processed.
  }
}

我已经验证了 datum 一旦被处理,就会被垃圾回收,不应该被 Avro 保留在内存中。 您是否有可能将数据保存在一个集合中或在您的代码中保留一个引用? 当然,这样可以防止垃圾收集。

Avro可能会将整个文件内容读到内存中的另一种方式是,如果Avro文件中只有一条2.5GB的记录......在这种情况下,你可能要重新审视你的数据存储设计了!

以上是关于如何读取大的avro文件,并将整个文件加载到内存中。的主要内容,如果未能解决你的问题,请参考以下文章

BufferedReader 如何从 S3 读取文件?

如何逐行读取大型文本文件,而不将其加载到内存中?

如何使用 Python 和 Pandas 创建比 RAM 更大的 csv 文件

Actionscript 3,只能读取文件的一部分而不将整个文件加载到内存中

从文本文件中读取第一行而不将整个文本文件加载到内存中

python 以块的形式读取文件而不将整个文件加载到内存中。