Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Метод хранения информации


Автор: SoWa 22.2.2011, 08:51
Привет, друзья!
Обращаюсь за советом, так как самостоятельно ничего не придумывается, а готовые решения в виде файлов не очень устраивают.

Задача: придумать, как хранить в БД типа MSSQL трехмерный массив размером минимум 1кк*1кк*2000 по ячеечкам - чтобы к каждой был доступ легкий  smile 

Есть какие-нибудь мысли?

Автор: panter 22.2.2011, 10:03
Код
CREATE TABLE some_table (cell_x INTEGER, cell_y INTEGER, cell_z INTEGER, cell_value INTEGER);

И навешиваешь индексы на cell_x, cell_y, cell_z.

Автор: Silent 22.2.2011, 10:12
Согласен с panter, если работать с MSSQL, то создаем таблицу
Код

CREATE TABLE `Table` (
`ID1` INT NOT NULL ,
`ID2` INT NOT NULL ,
`ID3` INT NOT NULL ,
`Value` INT NOT NULL ,
INDEX ( `ID1` , `ID2` , `ID3` ) 
);


и юзаем на здоровье конкретную ячейку, например, a[0][0][0]
Код

SELECT Value FROM `Table`
WHERE ID1=0 AND ID2=0 AND ID3=0


Но доступ таким образом будет достаточно долгим, по сравнению с памятью. Где эти данные используются? Возможно, стоит применить распределенную обработку, или те же самые файлы для хранения массива поблочно. Может быть, уважаемая SoWa, скажете, какую задачу решаете - наверняка есть способ обрабатывать ваши данные быстрее, чем с хранением в SQL?

Автор: Akina 22.2.2011, 11:47
Цитата(SoWa @  22.2.2011,  09:51 Найти цитируемый пост)
массив размером минимум 1кк*1кк*2000 

Т.е. 2*10^15 элементов? ты хорошо подумал? даже если предположить, что размер элемента 1 байт, это получится таблица на 2 петабайта... я уже даже не спрашиваю, где ты её хранить собираешься - как ты её получишь? даже тупо передача такого объёма с винта на винт (существуй такие винты) займёт несколько лет...
Или речь идёт о [censored] как разреженных данных? ну тогда хранить в структуре, описанной выше, а обрабатывать, наверное, в зависимости от целей либо напрямую, либо через OLAP.

Автор: SoWa 25.2.2011, 15:02
О да, спасибо за советы!
Кстати, оказалось, высоты массива достаточно 100, а не 2000. Поэтому размер уменьшается до 100 терабайт  smile 
Хотя если там будет int, то 400 терабайт. Думаю, что 1кк это тоже многовато, и там можно будет в 10 или 100 раз порезать.

Автор: миг 26.2.2011, 11:55
 в С++  
int(16 разрядный)- принимает значения в диапазоне (-32768 до +32767). Занимает 2 байта памяти 
int(32 разрядный)- принимает значения в диапазоне (-2 147 483 648 до +2 147 483 647). Занимает 4 байта памяти.
вы действительно собираетесь пользоваться всем этим диапазоном чисел? Рекомендую вам определиться с максимальным и минимальным числом, который будет записываться в базу данных. Исходя из этого можно будет выбрать наименьший размер данных для  хранения информации. Возможно придется работать с битовыми полями.

Автор: SoWa 26.2.2011, 12:46
Хранимое значение от нуля до нескольких миллионов(ориентировочный максимум 40кк).
Но это планы на лето smile

Добавлено через 3 минуты и 29 секунд
Если на каждого пользователя выделять по 5Мб памяти, то это кубик стороной 173. Неплохо.

Автор: Akina 26.2.2011, 19:52
Цитата(SoWa @  26.2.2011,  13:46 Найти цитируемый пост)
Если на каждого пользователя выделять по 5Мб памяти, то это кубик стороной 173

При 
Цитата(SoWa @  26.2.2011,  13:46 Найти цитируемый пост)
Хранимое значение от нуля до нескольких миллионов(ориентировочный максимум 40кк).

не 173, а 107. Как-то далековато от заявленных изначально миллионов...

Автор: SoWa 26.2.2011, 20:01
107, вероятно я ошибся.
Цитата(Akina @  26.2.2011,  19:52 Найти цитируемый пост)
Как-то далековато от заявленных изначально миллионов...

Пользователь не один ведь будет... Мильен - это на 10000 пользователей программа-максимум.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)