[英]Seek into a file full of pickled objects
我有這個龐大的文件與被腌制的對象,讓我們假設:
for object in objects:
pickle.dump(myfile,object)
雖然對象的類型相同,但它們的大小不同。
該文件在不同的場合會被填充很長時間,但有時,當轉儲過程重新啟動時,我需要讀取最后的對象。
像這樣的東西:
myfile.seek(-1000,2)
while myfile.tell() < mysize:
objects.append(pickle.load(myfile))
現在,這顯然不起作用,因為-1000通常不在其中一個對象的開頭,並且pickle引發異常等...
雖然我可以嘗試除了:傳遞並讓pickle失敗,直到它找到可選擇的東西,我真的不喜歡這個想法,我懷疑它確實在某些讀取嘗試上推進文件太多而我可能會丟失一些對象。
從頭開始讀取文件不是一個選項,因為它的大小。
有什么想法可行嗎? pickle有沒有辦法檢查當前文件光標是否指向看起來像對象的東西?
一種方法是做這樣的事情:
import os, pickle, struct
myfile = open('/path/to/my/file', 'w+b')
myfile.write(struct.pack('L', 0)) # write a long of zeroes
index = []
for o in objects:
index.append(myfile.tell())
pickle.dump(o, myfile)
index_loc = myfile.tell()
pickle.dump(index, myfile)
myfile.seek(0, 0, os.SEEK_SET)
myfile.write(struct.pack('L', index_loc))
現在您有一個索引文件:重新打開時,從初始字節讀取索引位置,然后搜索到該位置並讀取索引。 然后,您應該能夠以隨機訪問方式訪問文件中的任何對象。 (當然,您可以通過使索引成為文件位置的對象鍵的字典來概括這一點 - 一種窮人的ZODB)。
或者,當然,您可以使用擱架模塊。
保存由更新文件導致的每個文件大小增量的序列
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.