【问题标题】:Speeding up code to download files from a SFTP加速代码从 SFTP 下载文件
【发布时间】:2016-12-06 17:04:54
【问题描述】:

我想检查是否有更快的方法从物理计算机上的文件夹中不存在的 SFTP 下载数据。问题是这些文件是 5 分钟间隔的快照,而当前的 SFTP 文件夹有数千个(从 2016 年 8 月起至少每 5 分钟一次)。

我计划询问客户他们是否可以清理 SFTP 并有一个删除旧数据的过程,但同时我也想改进我的下载代码。

基本上,我检查 SFTP 上的每个文件夹,然后检查计算机上的相应文件夹。如果该文件不存在,那么我下载它(我现在使用的是 Windows 10)。即使列出所有文件并检查它们是否存在也需要很长时间(仅其中一个文件夹需要 1400 秒,这意味着我无法尝试每 5 分钟运行一次)。

with pysftp.Connection(host, username, password, port, cnopts) as sftp:
    logger.info('Server connected')
    for folder in folders:
        sftp.chdir(folder)
        logger.info('Downloading data from the {} folder'.format(folder))
        for file in sftp.listdir():
            if file not in os.listdir(os.path.join(path, folder.lower())) and sftp.isfile(file):
                logger.info('Downloading: {}'.format(file))
                os.chdir(os.path.join(path, folder.lower()))
                sftp.get(file, preserve_mtime=True)

以下是其中一个文件夹的确切文件名结构:

文件名-2016-12-06-08-55-05-to-09-00-17.csv

这一文件夹(共 7 个文件夹)有 30,000 个文件(仅 129MB 数据)

【问题讨论】:

  • 是否有一致的文件夹结构/命名约定?您可以假设它在那里并尝试根据存储格式/命名约定进行下载,而不是查看。
  • 文件夹结构是静态的,但命名不完全。该文件的名称是 filename-2016-12-07-20-15-04-to-2016-12-07-20-20-09。看起来秒是可变的。好吧,我再仔细看看,也许我可以用 glob 和通配符来代替秒
  • 获取文件列表并启动4个线程,每个线程下载一个文件
  • 另外,远程压缩,下载,然后在本地去复制呢?

标签: python sftp paramiko pysftp


【解决方案1】:

恐怕很难让这个脚本显着加快,因为paramiko 并不以超快着称。如果可能的话,这似乎更像是rsync 或类似的工作。如果远程主机上没有rsync,你仍然可以尝试通过sftp挂载远程文件系统并在本地运行rsync。

话虽如此,我注意到的一件事是表达式 os.listdir(os.path.join(path, folder.lower())) 会针对每个远程文件进行评估,即使它只在最外层循环的每次迭代中发生变化。因此,您可以为每个folder 构造一次该列表,然后重新使用它。然而,我怀疑这会产生很大的不同。

【讨论】:

  • listdir 不错。我能够编辑代码,它至少应该更有效率。最终,我只会让客户端设置一些清理过程,以便在我归档旧数据并将其加载到数据库后删除它。
猜你喜欢
  • 2018-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
相关资源
最近更新 更多