OK、私はあなたの質問のレイモンドヘッティンガーの解釈が正しいと信じている、とあなたのコメントは、キューの長さに関係じゃないことを明確にではなく、としていますすべてのファイルサイズの合計。それははるかに意味がある、と私は最終的にあなたが意味するものを理解してうれしいです。これを念頭に置いて、私があなたのすべての要求を満たすと信じているheapq
に基づく簡単な実装をここに示します。キュー上のput
ティン(timestamp, filename, filesize)
タプルで、それを使用して、キューからあなたget
アイテム、それは最も古いファイルになりますときに注意(最小のタイムスタンプを持つすなわちファイル。)
import heapq
class FilenameQueue(object):
def __init__(self, times_sizes_names, maxsize):
self.maxsize = maxsize
self.size = sum(s for t, s, n in times_sizes_names)
self.files = list(times_sizes_names)
heapq.heapify(self.files)
while self.size > self.maxsize:
self.get()
def __len__(self):
return len(self.files)
def put(self, time_size_name):
self.size += time_size_name[1]
if self.size < self.maxsize:
heapq.heappush(self.files, time_size_name)
else:
time_size_name = heapq.heappushpop(self.files, time_size_name)
self.size -= time_size_name[1]
def get(self):
time_size_name = heapq.heappop(self.files)
self.size -= time_size_name[1]
return time_size_name
私は__len__
を追加しましたメソッドを使用して、キューから取得する前にキューをテストできるようにします。ここでは使用例です:
>>> f = FilenameQueue(((22, 33, 'f1'), (44, 55, 'f2'), (33, 22, 'f3')), 150)
>>> while f:
... f.get()
...
(22, 33, 'f1')
(33, 22, 'f3')
(44, 55, 'f2')
>>> f = FilenameQueue(((22, 33, 'f1'), (44, 55, 'f2'), (33, 22, 'f3')), 150)
>>> f.put((55, 66, 'f4'))
>>> while f:
... f.get()
...
(33, 22, 'f3')
(44, 55, 'f2')
(55, 66, 'f4')
は最適ではないQueue.PriorityQueue
を含む、完全に別のソリューションのための私の編集履歴を参照してください。 maxsize
は、要素を破棄するのではなく、ブロック制限によって制限を適用することを忘れていました。それほど有用ではありません!
両端キューが自動的にオブジェクトを破棄 'maxlen'性質を持っているん:
はサンプル・セッションは、このようになります。キューのもう一方の端から – Darthfett
このリストの有効期間中にこれらのファイルの変更を計画していますか(「最も古い変更ファイルは「最新の変更ファイル」になる可能性があります)? また、「バッファに既に存在するすべてのファイルよりも古いファイル」を追加すると、キュー内のファイル数が減少するか、ファイルを無視しますか? – Darthfett
最大サイズはファイル名の長さによって異なるはずですか?ファイル名の_番号?ファイル名が参照するファイルの_size_? – agf