parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

^memory:compact[]

Таев Олег 23.11.2004 08:17

Пробуйте считывать/обрабатывать данные порциями, а после обработки выгружать массивы данных из памяти. С помощью метода ^memory:compact[] можно выбросить неинициализированные/пустые переменные.

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

Как альтернативу могу предложить использовать SQL, а именно: положите в базу данные по трафику, закройте файл, а потом тихо и мирно select'ами вытаскивайте порции данных. Если даже у вас нет разграничения на пользователей, а только входящий/исходящий трафик надо просуммировать, то в SQL-запросе напишите limit [from,]<length> - и всего делов (разумеется, после обработки текущей выборки очистите таблицу и упакуйте память). К тому же вы сможете извлекать НУЖНЫЕ столбцы таблицы, что еще раз приведет к сокращению используемой памяти.
$start_line(1)
$read_limit(1000)
$recs_count(^int:sql{select count(ip) from traffic})
^while($start_line<=$recs_count){
	$tab[^table::sql{select ip,bytes from traffic limit $start_line,$read_limit}]
	^tab.menu{
		^if($tab.ip eq $server){
			^down.inc($tab.bytes)
		}{
			^up.inc($tab.bytes)
		}
	}
	^start_line.inc($read_limit)
	$tab[]
	^memory:compact[]
}
$start_line[]
$recs_count[]
$read_limit[]
^memory:compact[]
Путем нехитрых экспериментов вы выясните, какое значение $read_limit для вас оптимально (по памяти и быстроте обработки)