Python:仅保留最后n个插入键的字典

时间:2018-06-30 14:01:36

标签: python dictionary data-structures

我打算从磁盘读取数百万个小文件。为了最大程度地减少I / O,我计划使用字典将文件路径映射到其内容。不过,我只希望字典保留插入其中的最后n个键(因此字典将充当缓存)。

Python中是否有已经实现此行为的数据结构?我想在重新发明轮子之前先检查一下。

3 个答案:

答案 0 :(得分:3)

为此使用collections.deque,最大长度为6,以便它仅存储最后6个元素,并将信息存储为键值对

from collections import deque
d = deque(maxlen=6)
d.extend([(1,1),(2,2),(3,3),(4,4), (5,5), (6,6)])
d
# deque([(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)], maxlen=6)
d.extend([(7,7)])
d
# deque([(2, 2), (3, 3), (4, 4), (5, 5), (6, 6), (7, 7)], maxlen=6)

答案 1 :(得分:2)

对于我的特殊问题,由于我需要从磁盘读取文件,因此我认为我将按照@PatrickHaugh的建议使用lru缓存。这是使用缓存的一种方法:

from functools import lru_cache

@lru_cache(maxsize=10)
def read_file(file_path):
  print(' * reading', file_path)
  return file_path # update to return the read file

for i in range(100):
  if i % 2 == 0:
    i = 0 # test that requests for 0 don't require additional i/o
  print(' * value of', i, 'is', read_file(i))

输出显示请求0不会产生额外的I / O,这是完美的。

答案 2 :(得分:1)

您可以使用collections.OrderedDict及其方法$methods = array( 'kex' => 'diffie-hellman-group1-sha1', 'hostkey' => 'ssh-dss', 'client_to_server' => array( 'crypt' => '3des-cbc', 'mac' => 'hmac-md5', 'comp' => 'none'), 'server_to_client' => array( 'crypt' => '3des-cbc', 'mac' => 'hmac-md5', 'comp' => 'none')); $connect = ssh2_connect('127.0.0.1', 22, $methods); if($connect) { echo 'succ'; } if(ssh2_auth_pubkey_file($connect, 'root', '/home/game/id_dsa.pub', '/home/game/id_dsa')) { echo "Public Key Authentication Successful\n"; } else { echo "Public Key Authentication Failed\n"; } 来确保仅保留添加到词典中的最后 n 个键。用popitem指定last=False可确保行为为“ FIFO”,即先进先出。这是一个简单的示例:

popitem