Сжимает ли sqlite3 данные? - программирование
Подтвердить что ты не робот

Сжимает ли sqlite3 данные?

У меня есть файл csv 7.4Gb. После преобразования в базу данных sqlite с python script выходной DB равен 4.7Gb, что составляет около 60% от исходного размера.

У csv около 150 000 000 строк. Он имеет заголовок:

tkey,ipaddr,healthtime,numconnections,policystatus,activityflag

И каждая строка выглядит примерно так:

261846,172.10.28.15,2012-02-03 16:15:00,22,1,1

script использует время работоспособности для разделения данных на таблицы 192 таблиц

Когда я впервые увидел эти цифры, я предположил, что я сделал ошибку где-то. Насколько велика вероятность уменьшения размера файла, я должен ожидать от добавленной эффективности только записи времени работоспособности 192 раза вместо 150 000 000 раз?

EDIT: Как только я разместил это, я понял ответ. Я удаляю около 40% строки, следовательно, уменьшение на 40%.

Изменить 2. Рассчитайте разницу в размере между обычным текстом:

"261846,172.10.28.15,2012-02-03 16:15:00,22,1,1" 

И запись базы данных:

db(261846,'172.10.28.15',22,1,1)

Прежде всего, мы оставляем от 46 до 26 символов в текстовом представлении.

Остальные символы:

"261846,172.10.28.15,22,1,1"

или 26 байтов. Если каждое целое число необходимо сохранить в 32 бит (4 байта), то у нас есть:

12 байт (ipaddr) + 4 байта * 4 (целочисленные поля) = 28 байт.

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

4b9b3361

Ответ 1

SQLite не запускает алгоритм сжатия, но он будет хранить данные в двоичном файле вместо текстового файла. Это означает, что данные могут храниться более эффективно, например, используя 32-разрядный (4 байтовый) номер для представления 10,000,000 вместо того, чтобы хранить его как 8 байтов текста (или больше, если файл является unicode).

Подробнее о Формат файла базы данных SQL, если вы заинтересованы.

Это имеет смысл?

Ответ 2

SQLite по умолчанию не сжимает данные, которые он записывает на диск; однако SQLite имеет набор "собственных расширений" для этого и других целей. Найдите ZIPVFS в ссылках следующим образом.

http://www.sqlite.org/support.html и http://www.hwaci.com/sw/sqlite/prosupport.html

Вы можете добиться большого количества "сжатия" в своих данных, закодируя поля как целые числа. Например, IP-адрес был спроектирован так, чтобы он вписывался в слово (4 байта). Каждый элемент адреса может быть представлен в один байт слова.

string[] octets = '172.168.0.1'.split('.')
int ip = atoi(octets[0]) << 24
ip |= atoi(octets[1]) << 16
ip |= atoi(octets[2]) << 8
ip |= atoi(octets[3])

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

UPDATE mytable SET healthtime = CAST(strftime('%s',healthtime) AS INTEGER);

Смотрите функции даты и времени

Обратите внимание на директиву CAST в приведенном выше SQL: SQLite не применяет тип в столбце, поэтому у вас может быть группа цифр, хранящихся в виде строки; увеличивая размер поля больше, чем необходимо (это также заставит некоторые запросы вести себя странно).

Еще одна вещь: размер поля - не единственная часть истории. Помните, что индексы занимают пространство, а индексы на целых числах более эффективны - в терминах размера и производительности диска.