Так недавно я взял на себя личный проект, чтобы сделать свою собственную БД на Python, главным образом потому, что я ненавижу возиться с большинством БД, и мне нужно было что-то легкое в настройке, переносном и простом изучать большие наборы данных.Как создать буферизованный писатель?
Теперь я обнаружил, что застрял в проблеме, эффективный способ удалить строку из файла DB (это действительно просто текстовый файл). То, как я нашел это, - это написать весь контент, который после строки перед ним, а затем truncate
файл (я предлагаю варианты по его лучшим способам). Проблема возникает, когда мне нужно написать контент после строки перед ним, потому что все это сразу может сразу загрузить миллионы строк в ОЗУ. Код следующим образом:
ln = 11 # Line to be deleted
with open("test.txt", "r+") as f:
readlinef = f.readline
for i in xrange(ln):
line = readlinef()
length, start = (len(line), f.tell()-len(line))
f.seek(0, 2)
chunk = f.tell() - start+length
f.seek(start+length, 0)
# How to make this buffered?
data = f.read(chunk)
f.seek(start, 0)
f.write(data)
f.truncate()
Сейчас вот читаешь все эти данные сразу, как я сделал бы, что последний блок коды работы в буферных модах? Начальная позиция будет переключаться каждый раз, когда перед этим будет записываться новый фрагмент данных, мне было интересно, что было бы самым эффективным и быстрым способом (временем выполнения).
Заранее спасибо.
редактировать
Я решил последовать советам, представленные здесь, но только ради любопытства я нашел способ, чтобы читать и писать на куски. Из этого следует:
with open("test.txt", "r+") as f:
readlinef = f.readline
for i in xrange(ln):
line = readlinef()
start, length = (f.tell()-len(line), len(line))
readf = f.read
BUFFER_SIZE = 1024 * 1024
x = 0
chunk = readf(BUFFER_SIZE)
while chunk:
f.seek(start, 0)
f.write(chunk)
start += BUFFER_SIZE
f.seek(start+length+(x*BUFFER_SIZE), 0)
chunk = readf(BUFFER_SIZE)
f.truncate()
Если эффективность, что вы после этого, вы используете наихудший структуру данных здесь. Удаление строки 2000 из 5000 по своей сути означает разбор 40% файла и переписывание 60% его, что гарантировано будет медленнее, чем что-либо еще, что вы могли бы сделать. – abarnert
«создайте мою собственную БД» + «легко настраивать, переносить и просто изучать большие наборы данных» + «удалить строку из файла БД (это действительно просто текстовый файл)» = Я заинтригован, сэр. – Hyperboreus
Теперь серьезно, почему бы вам просто не удалить запись, которую нужно удалить из индекса, и «вакуумировать» ваши файлы страниц, когда у вашей СУБД есть время для этого? – Hyperboreus