2016-12-06 169 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