我是apache avro的新手。我有一项任务是从oracle DB读取数据并从该数据生成avro。然后在第二个任务中从avro文件中读取数据并插入到MySQL DB中。
我成功完成了两项任务,最多可达1,00,000行(3列)。
但是当我将行增加到100万和6列(所有列中的小数据)时,我仍然能够生成33MB的avro文件。但是在第二个任务中,尽管提供了1 GB的内存限制,PHP avro库仍然为Allowed memory size of -- bytes exhausted
提供了错误。
$data_reader = \AvroDataIO::open_file($file_name);
// Read each datum
$i=0;
foreach ($data_reader->data() as $datum) {
调试后我发现,foreach语句无法执行并给出错误。我怀疑它是否尝试加载内存中导致错误的所有未压缩数据。
如果他们更好地阅读大型avro文件或者我需要生成更小的avro文件,或者我必须采用更高的内存限制。
更新:我查看了PHP库代码中的方法数据,其中找到了有问题的代码。
$data []= $this->datum_reader->read($this->decoder);
这会将所有数据存储在内存中。在https://github.com/researchgate/avro-php处对此库的替代更新使用PHP 5.5 yield,我认为应该解决此问题。但目前我使用的是没有收益率的php 5.4。