gpt4 book ai didi

java - 如何在关闭它并将其写入磁盘之前获取 ParquetWriter 对象的内存大小?

转载 作者:可可西里 更新时间:2023-11-01 14:41:00 27 4
gpt4 key购买 nike

我正在从流中读取 Avro 消息并使用 parquet.hadoop.ParquetWriter 将它们写入 Parquet 文件。我试图让输出文件的大小超过阈值限制。问题是 ParquetWriter 将所有内容都保存在内存中,并且只在 writer 关闭时才将其写入磁盘。根据 Parquet 文档,数据以最终格式写入内存对象,这意味着内存中对象的大小与磁盘上的最终大小相同。我的问题是如何获取内存中写入数据的大小,以便决定关闭编写器?

我尝试使用写入 ParquetWriter 的 avro 消息的字节大小作为 Parquet writer 文件大小的估计值,但这与 parquet writer 大小有很大不同,因为 parquet 存储数据的方式不同(柱状格式)。这是我所做的伪代码:

    ParquetWriter parquetWriter = new ParquetWriter(..., BLOCK_SIZE, PAGE_SIZE);    
long bytesWrittenSofar = 0;

public long getLength(){
return bytesWrittenSofar;
}
public void write(org.apache.avro.generic.GenericRecord record){
parquetWriter.write(record);
bytesWrittenSofar += avroToBytes(record).length;
}

public static byte[] avroToBytes(GenericRecord record){
GenericDatumWriter<GenericRecord> writer =
new GenericDatumWriter<GenericRecord>(record.getSchema());
ByteArrayOutputStream out = new ByteArrayOutputStream();
BinaryEncoder encoder = EncoderFactory.get().binaryEncoder(out, null);
writer.write(record, encoder);
encoder.flush();
out.close();
return out.toByteArray();
}

事实证明,我从 getLength() 获得的值与 parquet 文件的实际文件大小有很大不同。我知道架构将添加到文件末尾,但它非常小。只是给你一个想法,当 getLength() 报告 130MB 时,实际文件大小只有 80MB。

最佳答案

我没有找到访问 ParquetWriter 使用的内存的方法。相反,我最终分析了上传的文件大小和其中写入的记录数。使用以前的数据并通过计算写入当前文件的记录数,我估计了当前正在进行的文件的文件大小。事实证明,这比任何其他尝试都更接近真实文件大小。但是,这在很大程度上取决于您编写的应用程序和记录的变化。

关于java - 如何在关闭它并将其写入磁盘之前获取 ParquetWriter 对象的内存大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28888062/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com