在需要多次访问时处理列表 "quickly" 中的 900 000 个项目?

handling 900 000 items in a list "quickly" when needed to access it multiple times?

我有一个用例,我将“links”拉入服务器文件共享上的文件。

然后我需要 运行 对这些 link 进行一些正则表达式检查,并将它们分解成特定的部分,以便我可以对它们进行排序。

排序后,我需要将列表拆分为 x 个服务器以开始提取它们。排序很重要,因为每个拆分都需要均匀。

 ['/local/custom_name/a_database/database_name_56_1118843/file_1.tgz']
 ['/local/custom_name/a_database/database_name_56_1118843/file_3.tgz']
 ['/local/custom_name/a_database/database_name_56_1118843/file_4.tgz']
 ['/local/custom_name/a_database/database_name_56_1118843/file_2.tgz']

 ['/local/custom_name/a_database/database_name_655_1118843/file_1.tgz']
 ['/local/custom_name/a_database/database_name_655_1118843/file_2.tgz']
 ['/local/custom_name/a_database/database_name_655_1118843/file_3.tgz']
 ['/local/custom_name/a_database/database_name_655_1118843/file_4.tgz']
 
 ['/local/custom_name_4/b_database/database_name_5242_11132428843/file_1.tgz']
 ['/local/custom_name_4/b_database/database_name_5242_11132428843/file_2.tgz']

 ['/shared/custom_name/c_database/database_name_56_1118843/file_1.tgz']
 ['/shared/custom_name/c_database/database_name_56_1118843/file_2.tgz']
 
 ['/local/custom_name_4/c_database/database_name_58_1118843/file_1.tgz']
 ['/local/custom_name/ac_database/database_name_58_1118843/file_2.tgz']

例如,由于 a_database 中有 8 个文件,每个名称有 4 个文件,那么假设有 4 个服务器,我需要从每个路径到每个服务器的一个文件。

我所做的是查看每个 link,然后将路径分解为字典,其中第一个值是一个唯一 ID:

{'uid' : 'local_custom_name_a_database_database_name_56', 'link_list': [] }

然后在我再次浏览原始列表并添加任何适合字典的 link 之后:

{'uid' : 'local_custom_name_a_database_database_name_56', 'link_list': [ 
'/local/custom_name/a_database/database_name_56_1118843/file_1.tgz', 
'/local/custom_name/a_database/database_name_56_1118843/file_3.tgz', 
'/local/custom_name/a_database/database_name_56_1118843/file_4.tgz',
'/local/custom_name/a_database/database_name_56_1118843/file_2.tgz'
]}

然后在服务器之间拆分 link_list。

所有这些都按预期工作,但是第二部分,我将原始 link 与新字典 uid 进行比较并将 link 添加到列表中需要永远。 10000 件物品需要几分钟,但 900000 件物品看起来需要大约 125 小时。这不行。

实际数据更复杂,正在进行重要的排序,但这不是瓶颈。瓶颈在描述的地方。虽然逻辑有效,但我确定我没有以最有效的方式执行此操作。

感谢任何帮助。甚至只是向我指出一个更好的方法来处理本机列表和列表或字典列表之外的这么多项目。

如果性能是一个问题,那么这种类型的数据结构{'uid' : 'local_custom_name_a_database_database_name_56', 'link_list': [] }就会成为一个问题。根据 UID 查找元素是 O(n)。相反,您需要一个将 UID 直接映射到 link 列表的字典。这允许 O(1) 访问。如果需要,您可以稍后转换数据。

我不知道获取 UID 背后的确切逻辑,所以我只举一个例子:

l = [
    '/local/custom_name/a_database/database_name_56_1118843/file_1.tgz',
    '/local/custom_name/a_database/database_name_56_1118843/file_3.tgz',
    '/local/custom_name/a_database/database_name_56_1118843/file_4.tgz',
    '/local/custom_name/a_database/database_name_56_1118843/file_2.tgz',
    '/local/custom_name/a_database/database_name_655_1118843/file_1.tgz',
    '/local/custom_name/a_database/database_name_655_1118843/file_2.tgz',
    '/local/custom_name/a_database/database_name_655_1118843/file_3.tgz',
    '/local/custom_name/a_database/database_name_655_1118843/file_4.tgz',
    '/local/custom_name_4/b_database/database_name_5242_11132428843/file_1.tgz',
    '/local/custom_name_4/b_database/database_name_5242_11132428843/file_2.tgz',
    '/shared/custom_name/c_database/database_name_56_1118843/file_1.tgz',
    '/shared/custom_name/c_database/database_name_56_1118843/file_2.tgz',
    '/local/custom_name_4/c_database/database_name_58_1118843/file_1.tgz',
    '/local/custom_name/ac_database/database_name_58_1118843/file_2.tgz',
]

def getUid(s):
    return s[1:].rpartition("/")[0].rpartition("_")[0].replace("/", "_")

result = {}
for s in l:
    result.setdefault(getUid(s), []).append(s)

print(result)
{'local_custom_name_a_database_database_name_56': ['/local/custom_name/a_database/database_name_56_1118843/file_1.tgz',
  '/local/custom_name/a_database/database_name_56_1118843/file_3.tgz',
  '/local/custom_name/a_database/database_name_56_1118843/file_4.tgz',
  '/local/custom_name/a_database/database_name_56_1118843/file_2.tgz'],
 'local_custom_name_a_database_database_name_655': ['/local/custom_name/a_database/database_name_655_1118843/file_1.tgz',
  '/local/custom_name/a_database/database_name_655_1118843/file_2.tgz',
  '/local/custom_name/a_database/database_name_655_1118843/file_3.tgz',
  '/local/custom_name/a_database/database_name_655_1118843/file_4.tgz'],
 'local_custom_name_4_b_database_database_name_5242': ['/local/custom_name_4/b_database/database_name_5242_11132428843/file_1.tgz',
  '/local/custom_name_4/b_database/database_name_5242_11132428843/file_2.tgz'],
 'shared_custom_name_c_database_database_name_56': ['/shared/custom_name/c_database/database_name_56_1118843/file_1.tgz',
  '/shared/custom_name/c_database/database_name_56_1118843/file_2.tgz'],
 'local_custom_name_4_c_database_database_name_58': ['/local/custom_name_4/c_database/database_name_58_1118843/file_1.tgz'],
 'local_custom_name_ac_database_database_name_58': ['/local/custom_name/ac_database/database_name_58_1118843/file_2.tgz']}

然后,如果需要的话:

transformed = [{"uid": k, "link_list": v} for k, v in result.items()]
print(transformed)
[{'uid': 'local_custom_name_a_database_database_name_56',
  'link_list': ['/local/custom_name/a_database/database_name_56_1118843/file_1.tgz',
   '/local/custom_name/a_database/database_name_56_1118843/file_3.tgz',
   '/local/custom_name/a_database/database_name_56_1118843/file_4.tgz',
   '/local/custom_name/a_database/database_name_56_1118843/file_2.tgz']},
 {'uid': 'local_custom_name_a_database_database_name_655',
  'link_list': ['/local/custom_name/a_database/database_name_655_1118843/file_1.tgz',
   '/local/custom_name/a_database/database_name_655_1118843/file_2.tgz',
   '/local/custom_name/a_database/database_name_655_1118843/file_3.tgz',
   '/local/custom_name/a_database/database_name_655_1118843/file_4.tgz']},
 {'uid': 'local_custom_name_4_b_database_database_name_5242',
  'link_list': ['/local/custom_name_4/b_database/database_name_5242_11132428843/file_1.tgz',
   '/local/custom_name_4/b_database/database_name_5242_11132428843/file_2.tgz']},
 {'uid': 'shared_custom_name_c_database_database_name_56',
  'link_list': ['/shared/custom_name/c_database/database_name_56_1118843/file_1.tgz',
   '/shared/custom_name/c_database/database_name_56_1118843/file_2.tgz']},
 {'uid': 'local_custom_name_4_c_database_database_name_58',
  'link_list': ['/local/custom_name_4/c_database/database_name_58_1118843/file_1.tgz']},
 {'uid': 'local_custom_name_ac_database_database_name_58',
  'link_list': ['/local/custom_name/ac_database/database_name_58_1118843/file_2.tgz']}]