База данных SQLite: одна большая против нескольких маленькая? Параллельно писать в базу данных? - PullRequest
0 голосов
/ 24 февраля 2020

Поскольку я новичок в базах данных sqlite, я высоко ценю каждый полезный комментарий, ответ или ссылку на интересную тему и веб-сайты. Вот моя ситуация:

У меня есть каталог с 400 текстовыми файлами каждый размером ~ 7 ГБ. Соответствующая информация в этих файлах записывается в базу данных sqlite, в результате чего получается таблица 17.000.000x4, что занимает примерно 1 день. Позднее только я буду запрашивать базу данных для дальнейшего анализа данных.

Весь процесс создания базы данных может быть значительно ускорен, если будет возможна параллельная запись в базу данных. Например, я мог запустить несколько процессов параллельно, каждый из которых использовал только один из 400 текстовых файлов в качестве входных данных и записывал результаты в базу данных. Так можно ли позволить нескольким процессам выполнять параллельную запись в базу данных?


EDIT1: Ответ на комментарий W4t3randWinds: возможно (и быстрее) обрабатывать 1 файл на ядро , запишите результаты в базу данных и объедините все базы данных после этого. Однако запись в 1 базу данных с использованием многопоточности невозможна.


Кроме того, мне было интересно, будет ли эффективнее создать несколько баз данных вместо одной большой базы данных? Например, имеет ли смысл создавать базу данных для каждого txt-файла, в результате чего получается 400 баз данных, состоящих из таблицы 17.000.000 / 400 x 4?

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

Пожалуйста, см. Ниже мой код для создания базы данных.

### SET UP
# set up database
db = sqlite3.connect("mydatabase.db")
cur = db.cursor()
cur.execute("CREATE TABLE t (sentence, ngram, word, probability);")
# set up variable to store db rows
to_db = []
# set input directory
indir = '~/data/'

### PARSE FILES
# loop through filenames in indir
for filename in os.listdir(indir):
    if filename.endswith(".txt"):
        filename = os.path.join(indir, filename)
        # open txt files in dir
        with io.open(filename, mode = 'r', encoding = 'utf-8') as mytxt:

            ### EXTRACT RELEVANT INFORMATION
            # for every line in txt file
            for i, line in enumerate(mytxt): 
                # strip linebreak
                line = line.strip()
                # read line where the sentence is stated
                if i == 0 or i % 9 == 0:
                    sentence = line
                    ngram = " ".join(line.split(" ")[:-1])
                    word = line.split(" ")[-1]
                # read line where the result is stated
                if (i-4) == 0 or (i-4) % 9 == 0:
                    result = line.split(r'=  ')[1].split(r' [')[0]
                    # make a tuple representing a new row of db
                    db_row = (sentence, ngram, word, result)
                    to_db.append(db_row)

            ### WRITE TO DATABASE               
            # add new row to db
            cur.executemany("INSERT INTO t (sentence, ngram, word, results) VALUES (?, ?, ?, ?);", to_db)
            db.commit()
db.close() 

Ответы [ 2 ]

0 голосов
/ 24 февраля 2020

Я ежедневно обновляю базу данных SQLite, используя многопоточность python. Работает красиво. В двух разных таблицах содержится около 20 000 000 записей: одна с 8 полями, другая с 10. Это на моем ноутбуке, которому 4 года.

Если у вас проблемы с производительностью, я рекомендую изучить, как создаются ваши таблицы (правильный первичный ключ и индексы) и ваше оборудование. Если вы все еще используете жесткий диск, вы получите потрясающую производительность, перейдя на SSD.

0 голосов
/ 24 февраля 2020

Весь процесс создания базы данных может быть значительно ускорен, если есть возможность записи в базу данных параллельно

Я не уверен в этом. У вас мало обработки, поэтому весь процесс скорее всего будет связан. SQLite - очень хороший инструмент, но он поддерживает только один поток для записи в него.

Возможные улучшения:

  • использование потоков x для чтения и обработки текстового файла, одного один для записи в базу данных большими порциями и очередями. Поскольку процесс связан с вводом-выводом, глобальная межпроцессорная блокировка Python не должна быть проблемой.
  • использует полнофункциональную базу данных, такую ​​как PostgreSQL или MariaDB, на отдельном компьютере и несколько процессов на клиентском компьютере, каждый из которых обрабатывает свою собственный набор входных файлов

В любом случае я не уверен в преимуществе ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...