#python #database #sqlite
Вопрос:
Я конвертирую свои данные .xlsx в БД с помощью python, и размер вывода больше, чем я ожидал.
Таблица бд, которую я создаю, выглядит так:
def create_file():
cur.execute(
"""
CREATE TABLE IF NOT EXISTS [file](
[f_uid] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[f_name_key] VARCHAR(200),
[f_name_list] VARCHAR(1000),
[path] VARCHAR(1000),
[run_start_dt] VARCHAR(200),
[run_end_dt] VARCHAR(200),
[protocol_file_name] VARCHAR(200),
[sn] VARCHAR(200),
[head_sn] VARCHAR(200),
[version] VARCHAR(200)
);
""")
def create well():
cur.execute(
"""
CREATE TABLE IF NOT EXISTS [well](
[w_uid] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[w_no] VARCHAR(50),
[sample_key] VARCHAR(100),
[qa] TINYINT,
[call] VARCHAR(50),
[v1] FLOAT,
[v2] FLOAT,
[f_uid] INTEGER
);
""")
def create_value():
cur.execute(
"""
CREATE TABLE IF NOT EXISTS [value](
[v_uid] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
[w_uid] INTEGER,
[channel] VARCHAR(50),
[max_cycle] TINYINT,
[end_v] FLOAT,
[v_seq] TEXT NOT NULL
);
""")
Первая попытка, так как v_seq в таблице значений представляет собой длинный список поплавков в строке, но вывод составил около 12 ГБ
Вторая попытка, разделите этот v_seq на столбцы с плавающей точкой столько, сколько существует в списке, и поместите каждое значение с плавающей точкой в каждый столбец, вывод составил 9 ГБ
Третья попытка, вернитесь к первой попытке, измените v_seq на большой двоичный объект и заархивируйте длинный список поплавков в строке, объем вывода составил около 8,5 ГБ
Я не могу придумать больше способа уменьшить размер вывода. Можете ли вы подсказать мне какие-нибудь хорошие идеи?
Комментарии:
1. Насколько велик ваш файл xlsx? Кроме того, может быть проще выполнить вашу задачу в SQLite или MySQL workbench.
2. @Kraigolas я прочитал 3 типа файлов, по 12 кб, 33 кб и 235 кб каждый . Всего насчитывается 314 файлов. 235 кб-это те, которые содержат данные v_seq
3. «так
v_seq
как в таблице значений есть длинный список поплавков в строке», тогда, вероятно, ваша проблема. Вы 1) неправильно нормализуете свои данные. Вы должны создать отдельную таблицу, которая относится к[value]
внешнему ключу, в котором хранится каждое значениеv_seq
. Это решило бы 2) вы распределяете пространствоv_seq
, определяя его,TEXT
а не храните каждое значение в отдельной таблице. Если вы используете реляционную базу данных, такую как SQL, список элементов должен храниться в виде строк в таблице, а не в виде одного значения.4. @Kraigolas atm Я использую sqlite для работы с базой данных и таблицами. Если я правильно понял ваш комментарий, вы говорите, что разделение v_seq на новую таблицу и сохранение их в формате FLOAT для каждого столбца уменьшит размер файла?
5. w3schools утверждает, что
TEXT
содержит 65 535 байт. Я не уверен, что это переменный размер или предварительно выделенный (надеюсь, другой пользователь укажет на это). Несмотря на это, доступ и работа со значениями вv_seq
будет намного проще, если вы разделите их на другую таблицу, так что это стоит вашего времени, и я подозреваю, чтоTEXT
это не переменный размер, поэтому вы выделяете 65 кб на строкуv_seq
. Потому что ваша база данных должна быть около 100 МБ, а она увеличилась до 9 ГБ, так что это имеет смысл в качестве причины.