Поскольку я новичок в базах данных 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()