Я новичок в apache avro. У меня была задача прочитать данные из базы данных Oracle и сгенерировать avro из этих данных. Затем во втором задании прочитайте данные из файла avro и вставьте в базу данных MySQL.
Я успешно смог выполнить обе задачи для данных до 1 000 000 строк (3 столбца).
Но когда я увеличил строки до 1 миллиона и 6 столбцов (небольшие данные во всех столбцах), я все же смог сгенерировать avro-файл размером 33 МБ. Но во второй задаче PHP avro библиотека выдает ошибку для Allowed memory size of -- bytes exhausted
несмотря на предоставление 1 ГБ памяти.
$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, которые не имеют доходности.
Задача ещё не решена.
Других решений пока нет …