| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Базы данных под .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 | ||
Да спасибо, я прихожу к этому же выводу. Только все же в базе хранить имя файла, в котором лог. А логи пусть хранятся в отдельных файлах с разными именами. Я просто хотел услышать от кого-то о реальном проекте, где стояла подобная же проблема. Казалось, что в современном мире гиговые логи и их хранение задача частая. |
| Автор: likegift 19.5.2011, 21:24 |
| Ну и зачем в таком случае база, если логи все равно хранятся в файлах. А разделение на файлы по какому принципу? |
| Автор: jorikdima 20.5.2011, 09:04 | ||
Каждый лог в отдельном файле. А в базе хранится описание лога, дата, время и много других параметров. Каждая сточка базы это набор таких параметров, относящихся к одному логу + путь к файлу лога. |
| Автор: likegift 20.5.2011, 09:54 | ||||
это конечно не мое дело, но обычный лог, состоящий из тела лога, статуса лога, id лога и времени лога не тока проще хранить в базе, но и изымать оттуда, используя гибкий механизм запросов. а так получается, изучая состояние системы за определенный период, я должен выбрать несколько файлов и работать с ними? |
| Автор: jorikdima 20.5.2011, 10:01 | ||
Посмотрите на мое первое сообщение. Я именно такую систему сейчас и сделал, когда "обычный лог, состоящий из тела лога, статуса лога, id лога и времени лога хранится в базе и изымается, использую гибкий механизм запросов". Но вот гибкий механизм запросов не позволяет изъять только часть тела лога из базы. В терминах БД нет возможности прочитать часть строки БД. Или я чего-то не знаю? При переходе к файлам строка БД будет читаться очень быстро ибо имеет только ссылку на файл с логом, а не сам лог в качестве одного из полей БД. |
| Автор: likegift 21.5.2011, 05:51 |
| А что является у вас телом лога? |
| Автор: jorikdima 21.5.2011, 08:29 | ||
Большой (скажем до 200-300 Мб) массив байт. |