我想检查是否有更快的方式从物理计算机上的文件夹中不存在的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到09-00-17.csv
这个文件夹(7个文件夹中)有30,000个文件(只有129MB的数据)
答案 0 :(得分:1)
我担心由于paramiko
的速度不是很快,因此很难使这个脚本更快。如果可能的话,这似乎更像是rsync
或类似的工作。如果远程主机上没有rsync
,您仍然可以尝试通过sftp挂载远程文件系统并在本地运行rsync。
话虽如此,我注意到的一件事是对每个远程文件计算表达式os.listdir(os.path.join(path, folder.lower()))
,即使它只对最外层循环的每次迭代都进行了更改。因此,您可以为每个folder
构建一次该列表,然后重新使用它。不过,我怀疑这会产生很大的不同。