Сжимает ли 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 байт.
Итак, похоже, что преобразование в целые числа делает хранилище немного менее эффективным, и все мои выигрыши приходят, уменьшая количество символов, хранящихся в каждой строке.
Ответы
Ответ 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 не применяет тип в столбце, поэтому у вас может быть группа цифр, хранящихся в виде строки; увеличивая размер поля больше, чем необходимо (это также заставит некоторые запросы вести себя странно).
Еще одна вещь: размер поля - не единственная часть истории. Помните, что индексы занимают пространство, а индексы на целых числах более эффективны - в терминах размера и производительности диска.