powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Получение данных из большой таблицы
12 сообщений из 37, страница 2 из 2
Получение данных из большой таблицы
    #35602446
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скрябин Дмитрий wrote:

> На самом деле это не так. Точнее не совсем так, о чем нам и говорит
> первый абзац в разделе "38.7. Cursors" в документации. Я написал 2
> тестовых скрипта, первый тянет данные одним запросом, второй - через
> курсоры. Второй использует в разы меньше памяти. Если интересует - могу
> выложить текст скриптов, сами убетитесь или опровергните мое утверждение.

Ну давайте.
Я вот не могу представить, почему бы это могло быть так.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Получение данных из большой таблицы
    #35602766
MasterZiv, тестовыя таблица temp из 3114832 записей.
В первом случае выполняем запрос целиком:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
#!/usr/bin/php -q
<?
function getmem($pid){
  exec("ps -o rss -p ".$pid, $o);
  return $o[ 1 ];
}

$connect=pg_connect("host=127.0.0.1 user=test password=test dbname=g3");
$pgpid=pg_get_pid($connect);

echo "Before query\n";
echo "php Process mem: ".getmem(getmypid()),"kb\n";
echo "postgres process mem: ".getmem($pgpid)."kb\n";

$query=pg_query($connect,'select * from temp');

echo "\nAfter query\n";
echo "php Process mem: ".getmem(getmypid()),"kb\n";
echo "postgres process mem: ".getmem($pgpid)."kb\n";

pg_close($connect);
?>
Результат:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Before query
php Process mem:  5020kb
postgres process mem:  2144kb

After query
php Process mem: 795356kb
postgres process mem:  3504kb
PHP раздулся до 790Мб

Второй вариант, загружаем данные в курсоре по 100000 записей:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
#!/usr/bin/php -q
<?
function getmem($pid){
  exec("ps -o rss -p ".$pid, $o);
  return $o[ 1 ];
}

$connect=pg_connect("host=127.0.0.1 user=test password=test dbname=g3");
$pgpid=pg_get_pid($connect);

echo "Before query\n";
echo "php Process mem: ".getmem(getmypid()),"kb\n";
echo "postgres process mem: ".getmem($pgpid)."kb\n";

pg_query($connect,'begin transaction');
pg_query($connect,'declare test cursor for select * from temp');
echo "\nAfter build cursor\n";
echo "php Process mem: ".getmem(getmypid()),"kb\n";
echo "postgres process mem: ".getmem($pgpid)."kb\n";

$query=pg_query($connect,'fetch 100000 from test');
while(pg_num_rows($query)> 0 ){
  echo "\nAfter query\n";
  echo "php Process mem: ".getmem(getmypid()),"kb\n";
  echo "postgres process mem: ".getmem($pgpid)."kb\n";
  unset($query);
  $query=pg_query($connect,'fetch 100000 from test');
}

pg_query($connect,'close test');
pg_query($connect,'commit');
pg_close($connect);
?>
Вывод (начало и конец):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Before query
php Process mem:  5028kb
postgres process mem:  2144kb

After build cursor
php Process mem:  5068kb
postgres process mem:  3008kb

After query
php Process mem: 30468kb
postgres process mem:  3464kb

....

After query
php Process mem: 30668kb
postgres process mem:  3464kb

After query
php Process mem: 30672kb
postgres process mem:  3464kb

After query
php Process mem:  9072kb
postgres process mem:  3976kb
В процессе работы процесс потреблял не более 30Мб.
По-моему, результат на лицо.
...
Рейтинг: 0 / 0
Получение данных из большой таблицы
    #35602973
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скрябин Дмитрий wrote:
> MasterZiv, тестовыя таблица temp из 3114832 записей.
> В первом случае выполняем запрос целиком:

Это вы не так смотрите. Это вы FETCH тестируете и PHP.
PHP я бы вообще исключил бы из эксперимента, простой консолькой
работал бы.

Ну и в одном случае вы ждёте выполнения запроса до конца,
и засасывания всех его результатов в память.
А во втором случае - не ждёте до конца, получаете только
100 тыщ записей, ну и памяти меньше, потому что
получаете и выбрасываете тут же.

Не, в общем, не убедили.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Получение данных из большой таблицы
    #35603089
MasterZiv, либо вы себе противоречите, либо мы друг друга не поняли. Что касается php, то изначально я сказал, что буду писать на php или python. Теория с командной строкой не канает - нужно проверять в том, в чем будешь работать. Хотя с командной строкой будет так же ;)
...
Рейтинг: 0 / 0
Получение данных из большой таблицы
    #35603187
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скрябин Дмитрий wrote:

> MasterZiv, либо вы себе противоречите, либо мы друг друга не поняли. Что
> касается php, то изначально я сказал, что буду писать на php или python.

Вы можете в этом вашем PHP или питоне (думаю, в питоне точно можно)
вы-FETCH-ивать ПО ОДНОЙ строке ? Если сможете, на клиенте вообще
практически память заниматься не будет.

> Теория с командной строкой не канает - нужно проверять в том, в чем
> будешь работать. Хотя с командной строкой будет так же ;)

Нужно думать мозгами, а не проверять.
Я вам говорю, что эти два способа ничем
друг от друга не отличаются. Память жрёт ваш PHP, куда вы
запихиваете ВЕСЬ набор данных в одном случае, и 100 тыщ
записей в другой. А жрать оно не должно ВООБЩЕ ничего в
нормально написанном приложении (для вашей конкретной цели).

Возмите выполните в psql тот же запрос, и поглядите
сколько он будет сжирать памяти, я думаю, вы не заметите
большой разницы.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Получение данных из большой таблицы
    #35603189
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скрябин Дмитрий wrote:
> MasterZiv, либо вы себе противоречите, либо мы друг друга не поняли.

А, я понял, почему по вашему мнению я сам себе противоречу.

Я вообще про производительность клиента не говорил. Только про серверную.
Вы же меня грузите клиентской производительностью. А она
тут вообще роли не играет, если всё нормально делать.
Производительность суммарная будет определяться производительностью
чтения PSQL-ем данных из таблицы и записи вашим клиентом туда, куда
вы там записываете (например, диска).
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Получение данных из большой таблицы
    #35603906
Sad Spirit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv
Нужно думать мозгами, а не проверять.
Я вам говорю, что эти два способа ничем
друг от друга не отличаются. Память жрёт ваш PHP, куда вы
запихиваете ВЕСЬ набор данных в одном случае, и 100 тыщ
записей в другой. А жрать оно не должно ВООБЩЕ ничего в
нормально написанном приложении (для вашей конкретной цели).

Возмите выполните в psql тот же запрос, и поглядите
сколько он будет сжирать памяти, я думаю, вы не заметите
большой разницы.


Память жрёт не PHP, а клиентская библиотека libpq. В случае с psql числа будут примерно такими же.

И вообще, MasterZiv , уровень понтов в твоих сообщениях значительно превосходит уровень понимания вопроса.
...
Рейтинг: 0 / 0
Получение данных из большой таблицы
    #35604279
MasterZiv, вы бы сначала проверили, а затем уже говорили. psql - это простейшая оболочка, тот же клиент. И она тоже получает все данные за раз.
Что касается сервера - он отдает то, что у него попросили. Попросили 100 записей - он отдал 100 записей, попросили все - он отдал всё.
Если вы считаете, что запрашивать данные с сервера по одной строке - это правильное решение, то вы, мягко говоря, ошибаетесь. Это не есть "нормально написанное приложение". И не важно, какой язык. хоть си, хоть php.
...
Рейтинг: 0 / 0
Получение данных из большой таблицы
    #35605318
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sad Spirit wrote:

> Память жрёт не PHP, а клиентская библиотека libpq. В случае с psql числа
> будут примерно такими же.

В общем-то разница небольшая. Но я думаю всё же, что это именно PHP.

> И вообще, *MasterZiv*, уровень понтов в твоих сообщениях значительно
> превосходит уровень понимания вопроса.

Да пожалуйста, не хочешь - не слушай.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Получение данных из большой таблицы
    #35605325
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скрябин Дмитрий wrote:

> MasterZiv, вы бы сначала проверили, а затем уже говорили. psql - это
> простейшая оболочка, тот же клиент. И она тоже получает все данные за раз.

Всё же может быть построчно...

> Что касается сервера - он отдает то, что у него попросили. Попросили 100
> записей - он отдал 100 записей, попросили все - он отдал всё.
> Если вы считаете, что запрашивать данные с сервера по одной строке - это
> правильное решение, то вы, мягко говоря, ошибаетесь. Это не есть

Да,правильное. Запрашивать, обрабатывать, и освобождать память под следующие
данные. Так именно и работают высокопроизводительные утилиты типа выгзузки
данных. Можно обрабатывать также небольшими блоками, но это на самом деле
всё равно, обычно API работы с базой данных всё равно работает буферами
по N строк, по одной строке никто не дёргает.

> "нормально написанное приложение". И не важно, какой язык. хоть си, хоть
> php.

Ну, PHP-то здесь естественно ни при чём. Там можно было бы делать
fetch в курсоре по одной записи (по 10 записей). Или какой-то
другой вызов API делать, который не тащит весь набор на клиента.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Получение данных из большой таблицы
    #35605391
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скрябин Дмитрий wrote:
> MasterZiv, вы бы сначала проверили, а затем уже говорили. psql - это
> простейшая оболочка, тот же клиент. И она тоже получает все данные за раз.
> Что касается сервера - он отдает то, что у него попросили. Попросили 100

Ну, что ж вы мне тут рассказываете ?

Вот кусок кода PSQL

Код:
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
/*
  * ExecQueryUsingCursor: run a SELECT-like query using a cursor
  *
  * This feature allows result sets larger than RAM to be dealt with.
  *
  * Returns true if the query executed successfully, false otherwise.
  *
  * If pset.timing is on, total query time (exclusive of result-printing) is
  * stored into *elapsed_msec.
  */
static bool
ExecQueryUsingCursor(const char *query, double *elapsed_msec)
{




правда, оно там курсор серверный тоже явно использует.
Странно, почему. Ну да ладно, ведь может же по одной
строчке.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Получение данных из большой таблицы
    #35606686
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv, почитайте про libpq
...
Рейтинг: 0 / 0
12 сообщений из 37, страница 2 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Получение данных из большой таблицы
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]