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