- Поисковые системы
- Практика оптимизации
- Трафик для сайтов
- Монетизация сайтов
- Сайтостроение
- Социальный Маркетинг
- Общение профессионалов
- Биржа и продажа
- Финансовые объявления
- Работа на постоянной основе
- Сайты - покупка, продажа
- Соцсети: страницы, группы, приложения
- Сайты без доменов
- Трафик, тизерная и баннерная реклама
- Продажа, оценка, регистрация доменов
- Ссылки - обмен, покупка, продажа
- Программы и скрипты
- Размещение статей
- Инфопродукты
- Прочие цифровые товары
- Работа и услуги для вебмастера
- Оптимизация, продвижение и аудит
- Ведение рекламных кампаний
- Услуги в области SMM
- Программирование
- Администрирование серверов и сайтов
- Прокси, ВПН, анонимайзеры, IP
- Платное обучение, вебинары
- Регистрация в каталогах
- Копирайтинг, переводы
- Дизайн
- Usability: консультации и аудит
- Изготовление сайтов
- Наполнение сайтов
- Прочие услуги
- Не про работу
Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий
Есть ли возможность уменьшить потребление памяти массивами в PHP?
Нужно обрабатывать файл(текстовые данные), который для повышения скорости загоняется в массив, в итоге при обработке файла 200МБ оперативки потребляется 1,2 ГБ.
Может там какиенибудь индексы можно отключить(вроде там для поиска по массиву хэш функции данных гдето хранятся)? или сжать массив можно какнить? (падение производительности на 10-30% не страшно) Массив 2мерный.
PS.
Использование БД не рассматривается - производительность падает на 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);
Как уменьшить расход памяти:
1. "=str_replace" -> "=(int)str_replace"
2. $w[0] нужно транслитерировать в английские буквы, если по этому параметру происходит только поиск (соответственно, при поиске поисковая строка тоже транслитерируется).
а что потом с массивом делается? нельзя обрабатывать данные по строкам по мере чтения их из файла?
а что потом с массивом делается? нельзя обрабатывать данные по строкам по мере чтения их из файла?
На этапе чтения обработать данные невозможно - нужно проводить поиск/выборки/сортировки по всему массиву.
Рекомендации Шевцов-а опробую минут через 30 - щас закончится предъидущая обработка.
Ещё большее сжатие данных основывается на том, что многие имена часто повторяются и фамилии тоже не уникальные => можно разбить "имя фамилия" на два доп. массива. Один содержит $names['Имя'] = (int)$id1, второй - $families['Фамилия'] = (int)$id2. Имена и фамилии сортируются по частоте упоминания так, чтобы самые популярные имели наименьшие номера. Тогда $w[0] = "Андрей Кузнецов" можно записать как $w[0] = "1_1".
Можно ли имена и фамилии сжать так, чтобы $id1*const + $id2 < MAX_INT и $id1*const + $id2 были всегда уникальны - не в курсе. Смотрите на своих данных ;)
а что вы делали в БД? может просто грамотно переписать?
в SQL с данными можно делать почти все что угодно. а при использовании хранимых процедур и курсоров - вообще все
Ещё большее сжатие данных основывается на том, что многие имена часто повторяются и фамилии тоже не уникальные
Это мысль, наверняка получится сэкономить 20-40% используемой памяти.
А вот замена на кирилицу всех данных эффекта никакого не дала.
а что вы делали в БД? может просто грамотно переписать?
в SQL с данными можно делать почти все что угодно. а при использовании хранимых процедур и курсоров - вообще все
Даже незнаю где мог ошибиться при создание БД, т.к. было всего 2 поля оба с индексами, запросы вроде не через жо... скорость по началу была приемлимая, но после нескольких сотен тысяц запросов/обработки данных в БД она сильно фрагментируется и скорость работы просто никакая (при количестве фрагментов больше 5000 база просто замирает скорость работы не то что на 2 порядка падает а на все 3), в массивеже эти данные обработались за 15 часов (а в БД за 4 суток было готово только 25%)
(скорее всего ошибся в выборе БД - посоветовали использовать иноБД но до этого чет руки не дошли)
Это мысль, наверняка получится сэкономить 20-40% используемой памяти.
А вот замена на кирилицу всех данных эффекта никакого не дала.
Странно. Они должны храниться в памяти в юникоде. Хотя может при замене теперь лишняя память, ранее выделенная под строку, не высвобождается...
Слава Шевцов добавил 17.05.2009 в 13:33
а что вы делали в БД? может просто грамотно переписать?
в SQL с данными можно делать почти все что угодно. а при использовании хранимых процедур и курсоров - вообще все
Не всё. Далеко не всё. А некоторые вещи - очень медленно. Например, когда индекс не вмещается в память.
bimcom, Вы лучше опишите задачу целиком. Без бизнеса - только техническую часть. Может что подскажем по архитектуре. Либо в личку ;)
а. мифическая фрагментация данных на одном файле. ага припоминаю