我有一个Python应用程序的子例程,它获取一个包含8个字符序列号的列表,并在一组目录中搜索包含这些sn的文件名,这些sn具有一系列可能的扩展名。执行此操作的函数如下所示。在
def CompleteSN(SNorig, directories, exts, directoryContents=None):
# Split SNorig into its directory path and basename
directory, basename = os.path.split(SNorig)
#Don't try to complete if it has a directory already
if len(directory) > 0:
return SNorig
# Split the basename into extension (ext) and serial number (SN)
SN = basename[:8].upper()
#If we have a cache, check it
if directoryContents is not None:
if SN in directoryContents:
return directoryContents[SN]
else:
return None
possSNs = ['.'.join((SN, ext)) for ext in exts]
for pSN in possSNs:
for d in directories:
dpath = os.path.join(d, pSN)
if os.path.exists(dpath):
return dpath
return None
SN是要转换成完整路径的序列号,directories是要查找它的目录列表,exts是要尝试的可能扩展的列表(没有前导点),而directoryContents要么是None,要么是一个大dict(几十万个条目),dict将目录中要搜索的文件序列号映射到它们的全名。我的想法是,要完成一大组序列号,把所有能找到的序列号都放到字典里,这样就可以快速查找它们,而不是对每个序列号进行系统调用。为了完成大量的社交网络,这将是值得的成本,使dict
而且,正如我所预测的那样,一旦目录内容被填充,速度会快得多。但是,只有在不使用多处理时才会出现这种情况。我允许用户切换多处理模式,当directoryContents为None时,这比预期的更快。(例如,当我们通过检查文件的存在性来查找文件时os.path.exists)但是,当检查dict时,在多处理.池速度非常慢,只有不到10个SNs/秒。(与不使用多处理时的数千个相比)关于发生了什么,我最好的猜测是,无论Python使用什么机制在池工作器(我认为有8个)之间共享数据,都陷入了如此庞大的dict结构的泥潭。有人能帮我了解一下这里发生了什么事吗?在
一般来说,不应该在多个进程之间共享数据结构。同步过程中的开销通常会影响性能。也许你可以为每个进程创建一个单独的查找dict副本?在
相关问题 更多 >
编程相关推荐