использование памяти postgresql

mapt34

Новичок
Скрипт занимается синхронизацией 2х баз.

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

Код такой:

PHP:
class MPGDataBase {
    public function Query($sql) {
        return pg_query($this->conn,$sql);
    }
    public function Select($sql) {
        return new MPGSelectResult($this,$sql);
    }
}
class MPGSelectResult {
    public function __construct($db,$sql) {
        $this->result = $db->Query($sql);
    }
    public function __destruct() {
    	pg_free_result($this->result);
    	unset($this->result);
    }
}
function memoryUsage($usage, $base_memory_usage) {
	printf("Bytes diff: %d\n", $usage - $base_memory_usage);
}

$base_memory_usage = memory_get_usage();
memoryUsage(memory_get_usage(), $base_memory_usage);

echo "select users\n";
$obUsers = $DB->Select("SELECT * FROM users WHERE \"Agency\" IS NULL AND \"Active\"=true");
memoryUsage(memory_get_usage(), $base_memory_usage);

echo "unset obUsers\n";
unset($obUsers);
memoryUsage(memory_get_usage(), $base_memory_usage);
В итоге получаем такую вот фигню:
PHP:
Bytes diff: 92
select users
Bytes diff: 16148
unset obUsers
Bytes diff: 15792
15килобайт. Т.к. запросов выполняется порядка нескольких сот тысяч, получаем перерасход памяти.

Вопрос: что не так в коде, как этого избежать?

Очень не хочется писать пошаговый алгоритм, надеемся на помощь в поиске решения.
 

Sender

Новичок
я бы посоветовал локализовать проблему и замерять память на цикле, а не на одном проходе, там надо хорошо знать как php работает с памятью чтобы ожидать от unset сразу освобождение памяти. Так же хорошо посмотреть не только memory_get_usage, но и сколько в системе процесс памяти забрал.

также стоит обратить внимание на аргумент real_usage функции memory_get_usage

"Передача TRUE позволяет узнать реальное количество памяти, выделенной PHP скрипту системой. Если аргумент не задан или равен FALSE, будет возвращено только количество памяти, выделенное с помощью функции emalloc()."
 

weregod

unserializer
и ещё memory_get_peak_usage(), падает не из-за текущего расхода, а из-за пикового
 
Сверху