Python文件系统读取器性能
我需要扫描一个文件系统的文件列表,并记录那些不存在的文件。目前我有一个输入文件,其中有1300万个文件需要调查。此脚本需要从远程位置运行,因为我没有访问权限/无法直接在存储服务器上运行脚本 我目前的方法可行,但相对较慢。我对Python还是相当陌生的,所以我正在寻找加快速度的技巧Python文件系统读取器性能,python,performance,filesystems,Python,Performance,Filesystems,我需要扫描一个文件系统的文件列表,并记录那些不存在的文件。目前我有一个输入文件,其中有1300万个文件需要调查。此脚本需要从远程位置运行,因为我没有访问权限/无法直接在存储服务器上运行脚本 我目前的方法可行,但相对较慢。我对Python还是相当陌生的,所以我正在寻找加快速度的技巧 import sys,os from pz import padZero #prepends 0's to string until desired length output = open('./out.txt',
import sys,os
from pz import padZero #prepends 0's to string until desired length
output = open('./out.txt', 'w')
input = open('./in.txt', 'r')
rootPath = '\\\\server\share\' #UNC path to storage
for ifid in input:
ifid = padZero(str(ifid)[:-1], 8) #extracts/formats fileName
dir = padZero(str(ifid)[:-3], 5) #exracts/formats the directory containing the file
fPath = rootPath + '\\' + dir + '\\' + ifid + '.tif'
try:
size = os.path.getsize(fPath) #don't actually need size, better approach?
except:
output.write(ifid+'\n')
谢谢 您将受到I/O限制,特别是在网络上,因此您对脚本所做的任何更改都将导致非常小的加速,但我不知道:
import os
input, output = open("in.txt"), open("out.txt", "w")
root = r'\\server\share'
for fid in input:
fid = fid.strip().rjust(8, "0")
dir = fid[:-3] # no need to re-pad
path = os.path.join(root, dir, fid + ".tif")
if not os.path.isfile(path):
output.write(fid + "\n")
我真的不希望它更快,但可以说它更容易阅读
其他方法可能更快。例如,如果您希望接触大多数文件,您可以从服务器中提取一个完整的递归目录列表,将其转换为Python
set()
,并检查其中的成员资格,而不是在服务器上执行许多小请求。我将把代码留作练习…在我看来,padZero和字符串连接的东西似乎需要很长的时间
你想让它做的是把所有的时间都花在阅读目录上,而不是别的什么
你必须用python来做吗?我在C和C++中做过类似的事情。Java也应该相当不错
dirs = collections.defaultdict(set)
for file_path in input:
file_path = file_path.rjust(8, "0")
dir, name = file_path[:-3], file_path
dirs[dir].add(name)
for dir, files in dirs.iteritems():
for missing_file in files - set(glob.glob("*.tif")):
print missing_file
解释
首先将输入文件读入目录:filename的字典中。然后,对于每个目录,列出服务器上该目录中的所有TIFF文件,并(设置)从您应该拥有的文件名集合中减去这些文件。把剩下的打印出来
编辑:修复了一些愚蠢的事情。我写这篇文章的时候已经太晚了 我可能会使用shell命令一次性获得所有目录和子目录中文件的完整列表。希望这将最大限度地减少您需要向服务器发出的请求量 您可以通过执行以下操作获得远程服务器文件的列表:
- Linux:
将共享驱动器装载为
,然后执行/shared/directory/
ls-R/shared/directory>~/remote\u file\u list.txt
- Windows:使用
以驱动器号Map Network Drive
的形式装载共享驱动器,然后执行X:
dir/S X:/shared\u directory>C:/remote\u file\u list.txt
local\u file\u list.txt
相同的方法创建本地文件夹内容列表。然后,python脚本将简化为文本处理的练习
注意:我在工作中确实必须这样做。这基本上总是很慢,因为您要向服务器进行1300万次查询。如果服务器上没有太多的文件,几乎可以肯定的是,只需将整个目录列表记录下来,然后在本地进行所有处理,速度就会更快。你能做到吗?顺便说一句。有71k+个目录,每个目录大约有1000个文件。我将尝试您的解决方案,看看它是如何运行的。作为旁注,任何时候在字符串中使用反斜杠文字时,请使用原始字符串
r'\\server\share'
,而不是普通字符串'\\\\server\share'
。就目前情况而言,您很幸运,\s
没有特殊意义,但如果您尝试编写路径'\\server\new\u files'
,您将有一个不需要的新行。@Li aungYip这不是一个真正的路径,但感谢您的提示。为什么不使用Python?如果你使用C语言,它不会神奇地加速——问题仍然是1300万个服务器查询。我非常怀疑字符串处理的东西需要花费大量的时间。@Katrielex:字符串处理的东西与I/O相比不应该很大,但你不能依赖它。我已经看过很多次了。几张随机的堆叠照片就可以确定了。谢谢,我不得不对此进行一点扩展,但它工作得很好。希望明天我能知道它是否真的更快。