Слишком много данных, памяти не хватает

12
P
На сайте с 06.01.2009
Offline
592
1366

Здравствуйте. Извините, за нубский вопрос.

Уровень знаний в этой области у меня низкий (как мне сказал один товарищ в другой ветке).

Но вынужден просить у вас помощи и прошу вас подсказать мне

вываливается такая ошибка

Allowed memory size of 268435456 bytes exhausted (tried to allocate 64 bytes)

49я строка некоего php файла, который делает следующее.

Есть tabliza1 с 70 полями и 30000 строк.

Проблема началась, когда я попробовал взять данные с 30ти полей.

Пока брал только с 15ти полей, все было гут.


$result = mysql_query("SELECT ...
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
$idtov = $row['pole1'];

$massf[$idtov][0] = $row['pole2'];
$massk[$idtov][0] = $row['pole4'];
$massp[$idtov][0] = $row['pole5'];
$massr[$idtov][0] = $row['pole6'];
$massru[$idtov][0] = $row['pole7'];
$massm[$idtov][0] = $row['pole8'];
$massi[$idtov][0] = $row['pole9'];
$masse[$idtov][0] = $row['pole10'];
$masss[$idtov][0] = $row['pole11'];
и.т.д.
ещё 15 полей, но если их не закомментить, то вылезает ошибка что недостаточно памяти.

S
На сайте с 30.09.2016
Offline
469
#1

А что подсказать-то надо? Что под массив резервируется хренова куча оперативной памяти? Или как запрос к БД по частям сделать?

Отпилю лишнее, прикручу нужное, выправлю кривое. Вытравлю вредителей.
P
На сайте с 06.01.2009
Offline
592
#2
Sitealert:
А что подсказать-то надо? Что под массив резервируется хренова куча оперативной памяти? Или как запрос к БД по частям сделать?

Я понял. Так и думал что на куски разбивать. Просто показал тут кусок, что может быть мне бы сказали, что так то и так то можно ужать данные (ну типа того), что можно с массивами сделать так то и так то...Но если нет, то как я понимаю, только один вариант.

а именно, пилить запрос к бд на несколько...

а точнее, не все 30 тыс строк получать, а по 5 тыс строк, например, итого в 6 ть заходов.

или кстати вы про вариант, что получать данные не сразу по всем полям, а по 10-ть полей....

S
На сайте с 30.09.2016
Offline
469
#3

Лично я по строкам распилил бы - проще скрипт получится. Полей в таблице как-то многовато, кстати, но переделывать таблицы, я так понял, уже поздно.

И да, у Вас ещё много похожих двумерных массивов заложено - это тоже не есть гут. Это как бы впечатление, не вникая в цели и задачи.

danforth
На сайте с 18.12.2015
Offline
153
#4

Вам нужна пакетная обработка, или же расширять лимиты на память. Но вообще, конечно, лучше все таки пакетно обрабатывать.

Junior Web Developer
Aisamiery
На сайте с 12.04.2015
Offline
293
#5

как вариант вы можете не создавать массивы вообще. Для чего вы их делаете?

Нет возможности сразу вернуть дескриптор запроса и уже там где вы выводите массивы, обработать циклом while сам дескриптор?

Разработка проектов на Symfony, Laravel, 1C-Bitrix, UMI.CMS, OctoberCMS
Оптимизайка
На сайте с 11.03.2012
Offline
396
#6
⭐ BotGuard (https://botguard.net) ⭐ — защита вашего сайта от вредоносных ботов, воровства контента, клонирования, спама и хакерских атак!
P
На сайте с 06.01.2009
Offline
592
#7
danforth:
Вам нужна пакетная обработка, или же расширять лимиты на память. Но вообще, конечно, лучше все таки пакетно обрабатывать.

Мне подсказали вариант, что просто нужно как то обойтись без этих массивов.

Т.е. не писать в массивы, а сделать внутри цикла все что нужно, условно говоря считывать, обрабатывать построчно, а не все сразу.

ps Нет, все таки в цикле не получается, слишком долго все выполняется, что в итоге не выполняется.

Потому что он с каждым новым id из таб1, ищет такой же в таб2 каждый раз теперь, ищет и проверяет правильность данных(идет сравнение характеристик товара с id таким-то в таб1 и таб2, более 30-ти характеристик)
А раньше было просто в массиве все из первой, он шел в таб2 и тупо все по порядку id проверял.


---------- Добавлено 09.02.2017 в 20:09 ----------

Aisamiery:
как вариант вы можете не создавать массивы вообще. Для чего вы их делаете?
Нет возможности сразу вернуть дескриптор запроса и уже там где вы выводите массивы, обработать циклом while сам дескриптор?

Отвечаю цитатой того, что я написал чуть выше. Как раз попробовал. Не получается.


ps Нет, все таки в цикле не получается, слишком долго все выполняется, что в итоге не выполняется.
Потому что он с каждым новым id из таб1, ищет такой же в таб2 каждый раз теперь, ищет и проверяет правильность данных (идет сравнение характеристик товара с id таким-то в таб1 и таб2, более 30-ти характеристик)
А раньше было просто в массиве все из первой, он шел в таб2 и тупо все по порядку id проверял.

ps сравниваю, а не просто перезаписываю данные, чтобы вывести на экран инфо, какие именно характеристики и у какого id не соответствуют верным.

---------- Добавлено 09.02.2017 в 20:15 ----------

Sitealert:
Лично я по строкам распилил бы - проще скрипт получится. Полей в таблице как-то многовато, кстати, но переделывать таблицы, я так понял, уже поздно.
И да, у Вас ещё много похожих двумерных массивов заложено - это тоже не есть гут. Это как бы впечатление, не вникая в цели и задачи.

Я правильно понимаю - распилить по строкам, т.е. 30 тыс товаров сверять пакетами по 5 тыс например.

Второе - похожие двумерные массивы? Нет. Я наверное правильно сделал.

Есть id товара. Есть 30 характеристик.

mass_nazvanie_harakteristiki[$id][0] = значение_характеристики.

Далее, получая просто поочередно все id из таб2 в цикле проверяем, у данного id сходство характеристик.

т.е. что то типа

if (id_характеристика_такая_то!=mass_nazvanie_harakteristiki[$id][0]) {...}

S
На сайте с 30.09.2016
Offline
469
#8
postavkin:
Есть id товара. Есть 30 характеристик.

Насколько я вижу, дальше [0] дело не идёт. Этот элемент только память жрёт. Правильнее было бы так:

$idtov = $row['pole1'];


$tovary[$idtov]['massf'] = $row['pole2'];
$tovary[$idtov]['massk'] = $row['pole4'];
$tovary[$idtov]['massp'] = $row['pole5'];
$tovary[$idtov]['massr'] = $row['pole6'];
и.т.д.


---------- Добавлено 09.02.2017 в 21:41 ----------

А вот это уже отдельный вопрос:
postavkin:
Далее, получая просто поочередно все id из таб2 в цикле проверяем, у данного id сходство характеристик

Может быть, сразу в запросе подключать вторую таблицу через JOIN?

Malcolm
На сайте с 02.05.2007
Offline
119
#9

Правильнее будет вообще не проверять все 30 тысяч строк в массиве, а перестроить SQL запрос так, чтобы он сразу нужные строки возвращал. Т.е. в сам запрос добавлять условия проверки, соответствует характеристика нужной или нет.

P
На сайте с 06.01.2009
Offline
592
#10
Malcolm:
Правильнее будет вообще не проверять все 30 тысяч строк в массиве, а перестроить SQL запрос так, чтобы он сразу нужные строки возвращал. Т.е. в сам запрос добавлять условия проверки, соответствует характеристика нужной или нет.

Не представляю как это возможно. [ATTACH]160167[/ATTACH]

Ведь именно, что нужно проверить каждый id в таб2, все ли его характеристики сходятся с характеристиками из таб1.

jpg 160167.jpg
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий