Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Хранение больших массивов в БД


Автор: jorikdima 19.5.2011, 10:17
Приветствую.

Работаю с большими объемами данных, суточные логи определенных параметров. Храню все это в БД под управлением MSSQL Server CE 3.5. Размер лога может измеряться несколькими сотнями МБ. Сам лог храню в поле типа image
Проблема в том, что извлечение данных лога? являющейся одной строкой БД, естественно длительная и затратная по памяти процедура, так как поле типа image у меня многобегабайтное. И главное то, что весь этот лог никогда целиком не нужен. Сейчас я извлекаю все данные из поля типа image в массив byte[], затем беру оттуда только то, что нужно.

Нет ли возможности извлечь только часть данных из строки, а не всю строку? Сам подозреваю, что нет.
Каким образом люди хранят большие массивы данных, для которых надо еще хранить какое-то описание, типа где когда эти данные были собраны, при каких условиях и пр.?
Спасибо.

Автор: Artemon 19.5.2011, 10:40
Обычно если необходимы выборки по даным, то их хранят в виде таблицы с формализованными параметрами, а не скопом.

пример одной записи в таблице:

id - 1
EventType - Взлом системы
Description - bla-bla


Ну а далее например хотим выбрать только взломы, пишем: SELECT * FROM TABLE WHERE EventType= 'Взлом системы';



Автор: jonie 19.5.2011, 14:40
а чтобы свою базу не сделать? Много файловую. В одной собственно лог, в популярном формате текста 8)
а в реальной базе (раз уж так хочется) хранить описание + offset (смещение в байтах) записи в текстовом логе.
итого поиск будет быстр (база маленькая очень), а открытие лога не такое и затратное (openFile+seek+read N bytes)

Автор: jorikdima 19.5.2011, 16:55
Цитата(jonie @ 19.5.2011,  14:40)
а чтобы свою базу не сделать? Много файловую.

Да спасибо, я прихожу к этому же выводу. Только все же в базе хранить имя файла, в котором лог.  А логи пусть хранятся в отдельных файлах с разными именами.
Я просто хотел услышать от кого-то о реальном проекте, где стояла подобная же проблема. Казалось, что в современном мире гиговые логи и их хранение задача частая.

Автор: likegift 19.5.2011, 21:24
Ну и зачем в таком случае база, если логи все равно хранятся в файлах. А разделение на файлы по какому принципу? 

Автор: jorikdima 20.5.2011, 09:04
Цитата(likegift @ 19.5.2011,  21:24)
Ну и зачем в таком случае база, если логи все равно хранятся в файлах. А разделение на файлы по какому принципу?

Каждый лог в отдельном файле. А в базе хранится описание лога, дата, время и много других параметров. Каждая сточка базы это набор таких параметров, относящихся к одному логу + путь к файлу лога.

Автор: likegift 20.5.2011, 09:54
Цитата(jorikdima @ 20.5.2011,  12:04)
Цитата(likegift @ 19.5.2011,  21:24)
Ну и зачем в таком случае база, если логи все равно хранятся в файлах. А разделение на файлы по какому принципу?

Каждый лог в отдельном файле. А в базе хранится описание лога, дата, время и много других параметров. Каждая сточка базы это набор таких параметров, относящихся к одному логу + путь к файлу лога.

это конечно не мое дело, но обычный лог, состоящий из тела лога, статуса лога, id лога и времени лога не тока проще хранить в базе, но и изымать оттуда, используя гибкий механизм запросов.
а так получается, изучая состояние системы за определенный период, я должен выбрать несколько файлов и работать с ними?

Автор: jorikdima 20.5.2011, 10:01
Цитата(likegift @ 20.5.2011,  09:54)
это конечно не мое дело, но обычный лог, состоящий из тела лога, статуса лога, id лога и времени лога не тока проще хранить в базе, но и изымать оттуда, используя гибкий механизм запросов.
а так получается, изучая состояние системы за определенный период, я должен выбрать несколько файлов и работать с ними?

Посмотрите на мое первое сообщение. Я именно такую систему сейчас и сделал, когда "обычный лог, состоящий из тела лога, статуса лога, id лога и времени лога хранится в базе и изымается, использую гибкий механизм запросов". Но вот гибкий механизм запросов не позволяет изъять только часть тела лога из базы. В терминах БД нет возможности прочитать часть строки БД. Или я чего-то не знаю?
При переходе к файлам строка БД будет читаться очень быстро ибо имеет только ссылку на файл с логом, а не сам лог в качестве одного из полей БД.

Автор: likegift 21.5.2011, 05:51
А что является у вас телом лога?

Автор: jorikdima 21.5.2011, 08:29
Цитата(likegift @ 21.5.2011,  05:51)
А что является у вас телом лога?

Большой (скажем до 200-300 Мб) массив байт.

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