Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Есть проблема хранения 3000 переменных
Форумы портала PHP.SU » » Хранение данных, их вывод и обработка » Есть проблема хранения 3000 переменных

Страниц (1): [1]
 

1. Nosferatu - 10 Июля, 2011 - 13:28:03 - перейти к сообщению
Здравствуйте. Мне очень необходима помощь знающих людей.

Есть проблема хранения 3000 переменных, каждая переменная принимает значение 0 или 1. Данные настройки хранятся в БД.

Я додумался до четырёх решений.
1. Хранить всё как элементы в Массива, серилизовать, сжимать и хранить в БД как текст.
2. Хранить всё как Бинарное число. Редактировать как не знаю.
3. Хранить как Десятичное число. Редактировать как не знаю.
4. Хранить как Строку. Редактировать как строку.
5. Хранить каждую переменную отдельно в БД.
Смог реализовать первый вариант, но получилась строка в 6000 символов. Это очень много, если учесть что первоначально переменных 3000. Первый реализованный вариант мне не нравится, хоть он и является очень простым для работы.

Могли бы вы подсказать более быстрые и меньшие по размеру решения?
Пожалуйста, оцените решения по скорости работы и по количеству занимаемого места.
2. Craken - 10 Июля, 2011 - 13:33:21 - перейти к сообщению
Nosferatu пишет:
Здравствуйте. Мне очень необходима помощь знающих людей.

Есть проблема хранения 3000 переменных, каждая переменная принимает значение 0 или 1. Данные настройки хранятся в БД.

Я додумался до четырёх решений.
1. Хранить всё как элементы в Массива, серилизовать, сжимать и хранить в БД как текст.
2. Хранить всё как Бинарное число. Редактировать как не знаю.
3. Хранить как Десятичное число. Редактировать как не знаю.
4. Хранить как Строку. Редактировать как строку.
5. Хранить каждую переменную отдельно в БД.
Смог реализовать первый вариант, но получилась строка в 6000 символов. Это очень много, если учесть что первоначально переменных 3000. Первый реализованный вариант мне не нравится, хоть он и является очень простым для работы.

Могли бы вы подсказать более быстрые и меньшие по размеру решения?
Пожалуйста, оцените решения по скорости работы и по количеству занимаемого места.


Честно говоря я бы воспользовался вариантом номер 5.
БД на то и сеть База Данных, чтобы хранить данные в любом виде и сколько нужно! Тем более 3000 записей для БД - это семечки...
(Добавление)
По поводу скорости - тут уж смотря какой движок используется + кэширование!
Короче тут и скорость работы и размер занимаемой памяти зависит от того, как Вы настроите саму БД!
3. White - 10 Июля, 2011 - 13:38:51 - перейти к сообщению
2 - наиболее предпочтителен к памяти и скорости, 1 - наиболее прост, 4 - тоже не сложно, но не так требователен к памяти, 5 - самый медленный и требовательный к ресурсам
4. OrmaJever - 10 Июля, 2011 - 13:53:48 - перейти к сообщению
Мне кажется лутше всего хранить в масиве и не замарачиватся, но если значения могут быть только 0 или 1 то можно зделать одно число (как последовательность бит). Например

Только тогда нужно запомнитьна какой позиции какая настройка.
PHP:
скопировать код в буфер обмена
  1. //Взять 3 параметр
  2. echo $param{2};
  3. //Отредактирова 5 параметр
  4. $param{4} = 0;
5. Nosferatu - 10 Июля, 2011 - 19:32:37 - перейти к сообщению
OrmaJever пишет:
Мне кажется лутше всего хранить в масиве и не замарачиватся, но если значения могут быть только 0 или 1 то можно зделать одно число (как последовательность бит)

Спасибо за попытку, но не помогло. Написало что "Warning: Cannot use a scalar value as an array in index.php on line 40 "

Идиальный вариант это использовать строку битов, и проводить все манипуляции с ними. Считаю этот вариант самым лучшим как по скорости так и по объёму используемой памяти, но к сожалению возможности работы PHP с бинарными данными нету. Растерялся

White
Почти полностью согласен. Можете аргументировать позицию почему 5 самый медленный и требовательный??? Однако У меня есть предположения, но хотелось бы знать ваше мнение.

Craken
Читайте внимательнее. 3000 переменных-настроек, а не строк.
Строк там будет over 9000. Радость Соответственно не о какой таблице в 3000 столбцов речи идти не может.
Почему вариант 5??? Считаю что SQL серверу проще будет отдать одну большую ячейку, чем 1000 маленьких. Разве это не так??? Не понял
6. Мелкий - 10 Июля, 2011 - 19:46:08 - перейти к сообщению
Nosferatu пишет:
но к сожалению возможности работы PHP с бинарными данными нету.

http://php.su/learnphp/operators/?bool

Аналогично и сам mysql умеет.
7. DeepVarvar - 10 Июля, 2011 - 21:00:16 - перейти к сообщению
Вариант 5 + memcache
В нем хранятся уже сериализованые данные.
Десериализовывается автоматом.
В БД лезть не надо.
Поменять можно любой из 3000 параметров: Достал->Переопределил->Записал.
В базу сбрасывать только для сохранения "настроек".
По умолчанию 64 мБ.
Хватит?
8. RomAndry - 10 Июля, 2011 - 22:19:41 - перейти к сообщению
Как вариант использовать noSQL key-value
9. White - 10 Июля, 2011 - 22:26:40 - перейти к сообщению
DeepVarvar
для своего сервера или VPS да, но на хостинге не всегда он есть
10. DeepVarvar - 11 Июля, 2011 - 01:01:09 - перейти к сообщению
White пишет:
для своего сервера или VPS да
ну так если уж дело такое жареное...
Ну вот не могу я себе представить как запорожец (хоть обтюнингуй его) переворачивает камаза..
11. Nosferatu - 11 Июля, 2011 - 21:24:56 - перейти к сообщению
Сам задал вопрос сам на него и отвечу. Радость

По скорости работы получается так.
Быстрее
5 – массив с настройками собирается силами PHP при получение ответа от БД
4 – Требуется собирать разбирать строку в массив с настройками.
2-3 – нету простого способа работы с данными.
1 – сериализация-десерилизация данных.
Медленее.

По занимаемому месту в БД
Меньше
2-3 – Биты
5 – биты + нагрузка на создание ячеек.
4 – текстовая строка. ~3кб
1 – сериализованные данные. Больше 168 кб. 
Больше

В итоге первоначальная идея с сериализваным массивом, оказалась самой медленным и прожорливым решением. Разочарован очень сильно.

Нормального решения обработать пункты 2-3, силами PHP, нет. Более того оно ограничено 32 битами.

Решение с хранением в строке, хорошее, но проигрывает чуть-чуть решению с массивом.

Если посмотреть в первое сообщение, то можно заметить что решение использовать БД, пришло в самый последний момент. Тем не менее, остановился на нём.

DeepVarvar
Использовать MemCache для кеширования настроек которые будут использованы один раз в начале рабочей недели. Выглядит как минимум "странно". Ха-ха
Использование MemCache более оправдано, в случае с часто запрашиваемыми данными.

RomAndry
А я то думал реляционные базы всех победили, а нет конкуренты ещё есть...
Спасибо, на будущее обязательно познакомлюсь с решениями NoSql.

Мелкий
Спасибо, почитал. Это как то маловато. Если не ошибаюсь то PHP нет возможности объявить двоичное число. Ну и 32 бита в моём случае совсем не помогут.

Я остановился на варианте 5. Но если у кого будут интересные предложения, за исключением выбрать лучший движок/настроить БД/ использовать полезности/купить мощный сервак, то будут рад почитать.
12. new01 - 11 Июля, 2011 - 21:32:34 - перейти к сообщению
Nosferatu, мне просто интересно, а зачем 3000 переменных? Что это такое? Просто интересно)

 

Powered by ExBB FM 1.0 RC1