За последние 24 часа нас посетили 22335 программистов и 1628 роботов. Сейчас ищут 927 программистов ...

Скорость распределение памяти под массивы данных

Тема в разделе "Прочие вопросы по PHP", создана пользователем nologinname, 25 ноя 2014.

  1. nologinname

    nologinname Новичок

    С нами с:
    9 май 2014
    Сообщения:
    20
    Симпатии:
    0
    Здравствуйте.

    При работе с очень большими объёмами данных типа Array(), при заполнении 2,5 Гб и более, оперативы скриптом, возникает некий тормоз... система периодически подвисает
    И чем больше данных, тем дольше паузы

    Помогите разобраться: что происходит, и как с этим бороться?
     
  2. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    изменить логику работы. не храни все данные в оперативке, обрабатывай по частям.
     
  3. nologinname

    nologinname Новичок

    С нами с:
    9 май 2014
    Сообщения:
    20
    Симпатии:
    0
    это не реально
     
  4. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    почему нереально? что за данные? какая именно работа с ними происходит?
     
  5. nologinname

    nologinname Новичок

    С нами с:
    9 май 2014
    Сообщения:
    20
    Симпатии:
    0
    Математический скрипт по расчётам массивов
     
  6. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    математические возможности и скорости - не самая сильная сторона пхп. тем более с такими объемами.
    может лучше критичные места вычислять не на пхп, а на чемто пошустрее. типа с++ ?
     
  7. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    Тут даже не в "шустрее" дело, а в возможности обрабатывать данные за пределами возможностей оперативы. С другим языком можно добиться некоторого эффекта, но это только отодвинет момент когда всё опять упрется. Суперкомпьютера в распоряжении автора нет, я так понимаю. Решать проблему надо алгоритмически.
     
  8. nologinname

    nologinname Новичок

    С нами с:
    9 май 2014
    Сообщения:
    20
    Симпатии:
    0
    возможно)), но я знаю PHP, и нет времени учить что-то ещё
     
  9. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    кстати. обычные массивы в пхп довольно жирные.
    но есть альтернатива. например http://php.net/manual/ru/class.splfixedarray
    я незнаю специфики ваших данных, но посмотрите, может поможет
     
  10. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    А вообще для начала надо иметь диагноз.
    Сколько памяти доступно PHP? Т.е. сколько показывает phpinfo в параметре memory_limit ?
    Сколько памяти расходуется скриптом в этой задаче? Т.е. сколько покажет memory_get_peak_usage() в конце работы?
     
  11. nologinname

    nologinname Новичок

    С нами с:
    9 май 2014
    Сообщения:
    20
    Симпатии:
    0
    это не то, т.к. мы не имеем массивов фиксированной длины, а постоянно ковертить туда-сюда тоже не выход

    Добавлено спустя 50 секунд:
    memory_limit 80 GB
     
  12. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    это phpinfo показал или это написано в .ini — две большие разницы. и что там с пиковым расходом памяти?

    Добавлено спустя 2 минуты 21 секунду:
    какова вычислительная сложность алгоритма? если объем вычислений растет как квадрат от объема данных, то вы обречены на страдания )))

    Добавлено спустя 1 минуту 59 секунд:
    если отвечать на заголовок вашей темы буквально, то резервируйте память сразу, а не по одной ячейке. это снизит накладные расходы.
     
  13. nologinname

    nologinname Новичок

    С нами с:
    9 май 2014
    Сообщения:
    20
    Симпатии:
    0
    80Gb это я установил)

    и, ДА , объём вычислений и данных растёт как квадрат, ато и куб
    --------------------------

    а, например, если написать на СИ(под линукс), разве СИ и ПХП не похожи?
     
  14. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    профилируйте на что именно тратится бОльшая часть времени.
    Код (PHP):
    1. $t = microtime(true);
    2. // ... долгая операция ...
    3. printf('прошло %.4f', microtime(true) - $t);
    пробуйте холостые прогоны, например оставьте только рост массива, без вычислений. потом наоборот все вычисления, но без резервирования памяти (реальный результат в этот момент не важен) — на что уйдет больше времени?
    оптимизируйте только самые затратные вещи.

    p.s. так и не ответил на мой вопрос. ну и фиг с тобой.
     
  15. nologinname

    nologinname Новичок

    С нами с:
    9 май 2014
    Сообщения:
    20
    Симпатии:
    0
    на какой вопрос? даже обидно :((

    :)))
     
  16. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    сколько реально выделено памяти? напишешь в ini 1024 Gb и пыха реально выделить тебе 512 Mb. реальность сильнее хотелок. сколько показывает phpinfo?

    сколько памяти тратит скрипт — memory_get_peak_usage ?
     
  17. nologinname

    nologinname Новичок

    С нами с:
    9 май 2014
    Сообщения:
    20
    Симпатии:
    0
    phpinfo(); показывает столько, сколько выделено в настройках PHP(webmin)
    скрипт расчитан на работу со всем объёмом памяти, все расходы смотрю через системный монитор.

    по анализу работы, в следствие упрощения и урезки, делаем вывод:
    создаётся впечатление, что при добавлении элементов массива, в какой-то момент ПХП создаёт новый массив и добавляет значения в него...
    чем больше данных в массиве, тем дольше задержки
     
  18. runcore

    runcore Старожил

    С нами с:
    12 окт 2012
    Сообщения:
    3.625
    Симпатии:
    158
    а физически на сервере сколько памяти?
     
  19. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    не знаю что такое "вебмин", будем считать что это phpinfo ))) memory_get_peak_usage() — это функция, которую надо вставить в скрипт и посмотреть результат. она скажет сколько реально потратил скрипт из доступного.

    конечно, динамическое выделение памяти так и работает — сначала тебе дается кусок с небольшим запасом. если его не хватает, выделаяется новый кусок в два раза больше и все данные переносятся в него и т.д. я же писал: "резервируйте память сразу, а не по одной ячейке. это снизит накладные расходы."

    но без профилирования можно только гадать что именно тормозит. меряй!!!
     
  20. nologinname

    nologinname Новичок

    С нами с:
    9 май 2014
    Сообщения:
    20
    Симпатии:
    0
    видимо тормозит сам способ выделения памяти. с этим не поспорить... (

    но как заранее выделить массив, если не известен размер результирующего? ведь он может быть "в квадрате или кубе" от размера исходного (7-го прядка)....
     
  21. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    ))) ну не поспорить, так не поспорить. пиши на Си для Линукс, чо.

    +1 в моем игнор-листе
     
  22. nologinname

    nologinname Новичок

    С нами с:
    9 май 2014
    Сообщения:
    20
    Симпатии:
    0
    а я его знаю? ))))
     
  23. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну на джаве пиши. под линукс. пхп не создан для подобной работы.
     
  24. nologinname

    nologinname Новичок

    С нами с:
    9 май 2014
    Сообщения:
    20
    Симпатии:
    0
    а что джава создана для работы с массивами?

    КСТАТИ, а какой язык П. луше всего под это заточен?
     
  25. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    джава по крайней мере жестко типизированный язык. вы исходники пхп-машины читали? она ориентирована на генерацию трафика в вебе. быструю (ну тут сравнивать не с чем, имхо) и простую (тут скорее на деплой нужно смотреть. язык простой, кросплатформенный. написал и забыл. никаких костылей с препроцессорами, компиляцией и тому подобное). вычислять математические алгоритмы нужно явно не на пхп. идеально, имхо - с++. сами продумаете и оптимизируете алгоритм еще на стадии разработки.