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',

我需要扫描一个文件系统的文件列表,并记录那些不存在的文件。目前我有一个输入文件,其中有1300万个文件需要调查。此脚本需要从远程位置运行,因为我没有访问权限/无法直接在存储服务器上运行脚本

我目前的方法可行,但相对较慢。我对Python还是相当陌生的,所以我正在寻找加快速度的技巧

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相比不应该很大,但你不能依赖它。我已经看过很多次了。几张随机的堆叠照片就可以确定了。谢谢,我不得不对此进行一点扩展,但它工作得很好。希望明天我能知道它是否真的更快。