Ументшить потребление памяти array PHP

12
B
На сайте с 23.10.2006
Offline
170
2943

Есть ли возможность уменьшить потребление памяти массивами в PHP?

Нужно обрабатывать файл(текстовые данные), который для повышения скорости загоняется в массив, в итоге при обработке файла 200МБ оперативки потребляется 1,2 ГБ.

Может там какиенибудь индексы можно отключить(вроде там для поиска по массиву хэш функции данных гдето хранятся)? или сжать массив можно какнить? (падение производительности на 10-30% не страшно) Массив 2мерный.

PS.

Использование БД не рассматривается - производительность падает на 2 порядка

Слава Шевцов
На сайте с 23.07.2005
Offline
370
#1

Докупите память и не мучайтесь. Дешевле выйдет.

Хотя можете и код сюда кинуть на посмотреть.

Неизменность точки зрения неизменно порождает иллюзию понимания.
B
На сайте с 23.10.2006
Offline
170
#2

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

код:


$file = fopen("file.txt","r");
while (!feof ($file)) {
$w = explode("=", $input . fgets ($file, 1024));
//забиваем массив данными Имя Фамилия=Число
$genarray[$w[0]]=str_replace("\n","",str_replace("\r","",$w[1]));
}
fclose($file);
Слава Шевцов
На сайте с 23.07.2005
Offline
370
#3

Как уменьшить расход памяти:

1. "=str_replace" -> "=(int)str_replace"

2. $w[0] нужно транслитерировать в английские буквы, если по этому параметру происходит только поиск (соответственно, при поиске поисковая строка тоже транслитерируется).

dvaes
На сайте с 03.09.2007
Offline
65
#4

а что потом с массивом делается? нельзя обрабатывать данные по строкам по мере чтения их из файла?

B
На сайте с 23.10.2006
Offline
170
#5
dvaes:
а что потом с массивом делается? нельзя обрабатывать данные по строкам по мере чтения их из файла?

На этапе чтения обработать данные невозможно - нужно проводить поиск/выборки/сортировки по всему массиву.

Рекомендации Шевцов-а опробую минут через 30 - щас закончится предъидущая обработка.

Слава Шевцов
На сайте с 23.07.2005
Offline
370
#6

Ещё большее сжатие данных основывается на том, что многие имена часто повторяются и фамилии тоже не уникальные => можно разбить "имя фамилия" на два доп. массива. Один содержит $names['Имя'] = (int)$id1, второй - $families['Фамилия'] = (int)$id2. Имена и фамилии сортируются по частоте упоминания так, чтобы самые популярные имели наименьшие номера. Тогда $w[0] = "Андрей Кузнецов" можно записать как $w[0] = "1_1".

Можно ли имена и фамилии сжать так, чтобы $id1*const + $id2 < MAX_INT и $id1*const + $id2 были всегда уникальны - не в курсе. Смотрите на своих данных ;)

N
На сайте с 06.05.2007
Offline
419
#7

а что вы делали в БД? может просто грамотно переписать?

в SQL с данными можно делать почти все что угодно. а при использовании хранимых процедур и курсоров - вообще все

Кнопка вызова админа ()
B
На сайте с 23.10.2006
Offline
170
#8
Слава Шевцов:
Ещё большее сжатие данных основывается на том, что многие имена часто повторяются и фамилии тоже не уникальные

Это мысль, наверняка получится сэкономить 20-40% используемой памяти.

А вот замена на кирилицу всех данных эффекта никакого не дала.

netwind:
а что вы делали в БД? может просто грамотно переписать?
в SQL с данными можно делать почти все что угодно. а при использовании хранимых процедур и курсоров - вообще все

Даже незнаю где мог ошибиться при создание БД, т.к. было всего 2 поля оба с индексами, запросы вроде не через жо... скорость по началу была приемлимая, но после нескольких сотен тысяц запросов/обработки данных в БД она сильно фрагментируется и скорость работы просто никакая (при количестве фрагментов больше 5000 база просто замирает скорость работы не то что на 2 порядка падает а на все 3), в массивеже эти данные обработались за 15 часов (а в БД за 4 суток было готово только 25%)

(скорее всего ошибся в выборе БД - посоветовали использовать иноБД но до этого чет руки не дошли)

Слава Шевцов
На сайте с 23.07.2005
Offline
370
#9
bimcom:
Это мысль, наверняка получится сэкономить 20-40% используемой памяти.
А вот замена на кирилицу всех данных эффекта никакого не дала.

Странно. Они должны храниться в памяти в юникоде. Хотя может при замене теперь лишняя память, ранее выделенная под строку, не высвобождается...

Слава Шевцов добавил 17.05.2009 в 13:33

netwind:
а что вы делали в БД? может просто грамотно переписать?
в SQL с данными можно делать почти все что угодно. а при использовании хранимых процедур и курсоров - вообще все

Не всё. Далеко не всё. А некоторые вещи - очень медленно. Например, когда индекс не вмещается в память.

bimcom, Вы лучше опишите задачу целиком. Без бизнеса - только техническую часть. Может что подскажем по архитектуре. Либо в личку ;)

N
На сайте с 06.05.2007
Offline
419
#10

а. мифическая фрагментация данных на одном файле. ага припоминаю

12

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