[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Данные за каждый месяц
Страницы: 1, 2, 3, 4, 5, 6, 7, 8
Invis1ble
Смотри, я заюзал fetch() на таблице в 840k записей. Скрипт тестовый, не является частью приложения, т.е. не создаются никакие объекты и не используется реальная логика (что уменьшает затраты памяти в разы). Данные в БД реальные (старый бэкап).
$sql = 'SELECT * FROM `table`';

$start = memory_get_usage(true);

$sth = $dbh->query($sql);

while ($data = $sth->fetch()) {
$end = max($start, memory_get_usage(true));
unset($data);
}

echo 'fetch in loop: ' . number_format($end - $start, 0, '.', ' ') . "\n";

Результат скрипта:
Цитата
>php index.php
fetch in loop: 1 967 128 576

Как видишь, расходы памяти почти 2ГБ. Справедливости ради, окончания аналогичного теста с fetchAll() я не дождался, т.к. начался своп и тормоза. Но тем не менее, результат на лицо. Даже с fetch() в песочнице потребление памяти огромно. На продакшене всё равно пришлось бы юзать циклы.

PS. Мог накосячить с кодом, т.к. PDO в "чистом" виде юзал полтора раза 100 лет назад, на проекте используется ORM.

Ваш выход, мистер :)

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Valick
$sql = 'SELECT * FROM `table`';

$sth = $dbh->query($sql);

while ($data = $sth->fetch()) {
unset($data);
}

echo memory_get_peak_usage(true) . "\n";


_____________
Стимулятор ~yoomoney - 41001303250491
Invis1ble
Цитата (Valick @ 25.12.2014 - 15:53)
$sql = 'SELECT * FROM `table`';

$sth = $dbh->query($sql);

while ($data = $sth->fetch()) {
unset($data);
}

echo memory_get_peak_usage(true) . "\n";

Цитата
>php index.php
1967128576
Valick
результат вот этого кода пожалуйста
хотя я не вижу $dbh может у тебя там хз что подключено
$sql = 'SELECT * FROM `table`';

echo memory_get_usage(true) . "\n";

$sth = $dbh->query($sql);

$data = $sth->fetch();

echo memory_get_usage(true) . "\n";


и дамп 1 строки из БД плиз в студию

_____________
Стимулятор ~yoomoney - 41001303250491
Invis1ble
держи скрипт с самого начала, чтоб не думал, что я что-то скрываю )))
<?php

error_reporting(E_ALL);
ini_set('display_errors', 'On');

$dsn = 'mysql:dbname=test;host=127.0.0.1';
$user = 'root';
$password = 'root';

try {
$dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
echo 'Error: ' . $e->getMessage();
exit;
}

$sql = 'SELECT * FROM `table`';

$sth = $dbh->query($sql);

while ($data = $sth->fetch()) {
unset($data);
}

echo memory_get_peak_usage(true) . "\n";


Дамп непосредственно из БД тебе нужен или в результате работы скрипта $data на первой итерации?

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Invis1ble
Цитата
результат вот этого кода пожалуйста

Цитата
>php index.php
262144
1966866432
Guest
Invis1ble
может ты выбрал не правильное решении задачи? тебе нужно проверить работоспособность сайтов которые оставляют пользователи на lestinet.com?
Valick
Цитата
Дамп непосредственно из БД тебе нужен или в результате работы скрипта $data на первой итерации?

без разницы
$data = $sth->fetch();
var_dump($data);
unset($data);


_____________
Стимулятор ~yoomoney - 41001303250491
Invis1ble
Valick
давай всё же обойдемся без дампа, не хочу раскрывать схему БД. Скажи лучше, зачем он тебе, что конкретно ты хочешь узнать.
Если что, я проверял дамп, там, как и положено, смешанный массив со строковыми и числовыми ключами и данными из первой строки. Предвидя следующий вопрос, отвечу, что PDO::FETCH_ASSOC уменьшает потребляемый объем памяти незначительно, порядка нескольких десятков МБ.

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Valick
Invis1ble, ок, без дампа так без дампа

$sql = 'SELECT * FROM `table` LIMIT 10';

$sth = $dbh->query($sql);

while ($data = $sth->fetch()) {
unset($data);
}

echo memory_get_peak_usage(true) . "\n";


_____________
Стимулятор ~yoomoney - 41001303250491
Invis1ble
Цитата (Valick @ 25.12.2014 - 17:33)
Invis1ble, ок, без дампа так без дампа

$sql = 'SELECT * FROM `table` LIMIT 10';

$sth = $dbh->query($sql);

while ($data = $sth->fetch()) {
unset($data);
}

echo memory_get_peak_usage(true) . "\n";

Цитата
>php index.php
524288
Valick
Invis1ble, ты правда хочешь чтобы я поверил что первая строка выдала 1966866432, а 10 строк включая первую 524288? biggrin.gif


_____________
Стимулятор ~yoomoney - 41001303250491
Invis1ble
Valick
где ты увидел, что первая выдала 1966866432 ?

_____________

Профессиональная разработка на заказ

Я на GitHub | второй профиль

Valick
Цитата (Invis1ble @ 25.12.2014 - 18:05)
Valick
где ты увидел, что первая выдала 1966866432 ?

Цитата
результат вот этого кода пожалуйста
хотя я не вижу $dbh может у тебя там хз что подключено

$sql = 'SELECT * FROM `table`';

echo memory_get_usage(true) . "\n";

$sth = $dbh->query($sql);

$data = $sth->fetch();

echo memory_get_usage(true) . "\n";

Цитата (Invis1ble @ 25.12.2014 - 16:43)
Цитата
результат вот этого кода пожалуйста

Цитата
>php index.php
262144
1966866432
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.