Поток данных Magento занимает слишком много времени для загрузки файла CSV

У меня есть большой файл CSV, содержащий данные инвентаризации для обновления (более 35 000 строк). Я создал метод, который расширяет Mage_Catalog_Model_Convert_Adapter_Productimport для обновления инвентаря. Затем я использовал расширенный профиль для обновления, вызывающего этот метод.

Когда я запускаю профиль вручную, он работает очень хорошо. Проблема в том, что когда я использую расширение, которое обрабатывает профиль, запущенный в cronjob, системе требуется слишком много времени для загрузки и анализа CSV-файла. Я установил cronjob на ежедневное выполнение в 6:15 утра, но первая строка файла не будет обработана до 13:20 того же дня, загрузка файла занимает 7 часов.

Это как-то заставляет процесс останавливаться посередине, обрабатывается менее 1/3 записей. Я был разочарован, пытаясь понять, почему, пытался решить проблему, но безуспешно.

Любые идеи поощряются.


person Alex Phelan    schedule 23.06.2012    source источник
comment
Кажется очень странным, что загрузка файла занимает 7 часов. Вы подтвердили, что на самом деле он начинается в 6:15? Я предполагаю, что есть некоторое недоразумение с часовыми поясами   -  person nachito    schedule 23.06.2012
comment
Я бы выкинул сопли из созданного вами метода. Выйдите из системы в свой собственный файл журнала Mage::log('blah blah', null, 'yourlogfile.log');, чтобы вы могли видеть, что происходит   -  person CCBlackburn    schedule 24.06.2012
comment
Убедитесь, что вы обрабатываете столько строк за итерацию, сколько позволяют ресурсы вашего сервера (number_of_records).   -  person benmarks    schedule 24.06.2012


Ответы (1)


Varien_File_Csv - это класс, который анализирует ваш CSV-файл. Требуется слишком много памяти.

Функция для регистрации объема используемой памяти и пикового использования памяти,

public function log($msg, $level = null)
{
if (is_null($level)) $level = Zend_Log::INFO;

$units = array('b', 'Kb', 'Mb', 'Gb', 'Tb', 'Pb');
$m = memory_get_usage();
$mem = @round($m / pow(1024, ($i = floor(log($m, 1024)))), 2).' '.$units[$i];
$mp = memory_get_peak_usage();
$memp = @round($mp / pow(1024, ($ip = floor(log($mp, 1024)))), 2).' '.$units[$ip];

$msg = sprintf('(mem %4.2f %s, %4.2f %s) ', $mem, $units[$i], $memp, $units[$ip]).$msg;

Mage::log($msg, $level, 'my_log.log', 1);
}

$ MyClass-> log ('С каждым записываемым мной сообщением память становится ближе к небу');

Вы можете разделить свой csv (используйте одно и то же имя файла) и вызвать задание несколько раз. Вы должны быть уверены, что предыдущий вызов не будет выполняться одновременно с новым.

Спасибо

person Daniel Ifrim    schedule 25.06.2012