所以最近我作为一个个人项目在Python中创建了我自己的数据库,主要是因为我讨厌与大多数数据库混杂在一起,而且我需要一些易于安装,便于携带且易于学习大型数据集的东西。如何制作缓冲作家?
我现在发现自己陷入了一个问题,一种从DB文件(这实际上只是一个文本文件)中删除一行的有效方法。我发现这样做的方式是在它之前写的所有行后的内容多数民众赞成,然后truncate
文件(我采取更好的方法建议这样做)。当我需要在内容之前写下内容时,问题就到了,因为一次完成所有内容都可能会一次将数百万行载入到RAM中。代码如下:
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行中的2000行意味着解析文件的40%并重写60%,这肯定比任何你能做的事都慢。 – abarnert
“让我自己的数据库”+“易于安装,便于携带和简单地学习大型数据集”+“从数据库文件中删除一行(实际上只是一个文本文件)”=我很感兴趣,先生。 – Hyperboreus
现在认真的是,为什么不删除索引中要删除的记录,并且在数据库管理系统有时间的情况下“真空”你的页面文件? – Hyperboreus