каков будет эффективный способ увеличения размера БД?

#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 ГБ, так что это имеет смысл в качестве причины.