2016-12-06 171 views
0

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

我打算问客户他们是否可以清理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到09-00-17.csv

这一个文件夹(7个文件夹中)有30,000个文件(只有129MB的数据)

+0

是否存在一致的文件夹结构/命名约定?而不是看你可以认为它在那里,并尝试根据存储格式/命名约定进行下载。 –

+0

文件夹结构是静态的,但命名不完全。文件的名称是filename-2016-12-07-20-15-04-to-2016-12-07-20-20-09。它看起来像秒是可变的。那么,我会更仔细地看,也许我可以使用glob和通配符来替换秒 – trench

+0

你能提供一个在你的问题结构/命名约定的例子吗?它可以帮助某人提供更好的答案。啊,是的,时间很难。 –

回答

1

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

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

+0

在listdir上的好处。我能够编辑代码,至少它应该更有效一些。最终,我会让客户端设置一些清理过程,以便在将其归档并将其加载到数据库后删除旧数据。 – trench