2011-09-27 70 views
3

我使用paramiko在python中打開遠程sftp文件。用paramiko返回的文件對象,我正在逐行讀取文件並處理信息。與使用os內置的「open」方法相比,這看起來非常慢。以下是我用來獲取文件對象的代碼。在Python中使用paramiko打開遠程文件慢

使用的paramiko(由2倍慢) -

client = paramiko.SSHClient() 
client.load_system_host_keys() 
client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) 
client.connect(myHost,myPort,myUser,myPassword) 
sftp = client.open_sftp() 
fileObject = sftp.file(fullFilePath,'rb') 

使用操作系統 -

import os 
fileObject = open(fullFilePath,'rb') 

我錯過了什麼?有沒有辦法使paramiko fileobject的讀取方法與使用os fileobject的讀取方法一樣快?

謝謝!

+0

噢,我應該提到,你不需要在'sftp.file'調用'rb'中的'b'。從paramiko docs:「python'b'標誌被忽略,因爲SSH將所有文件視爲二進制文件。」 – jozzas

回答

6

您的問題很可能是由作爲遠程對象的文件造成的。你已經在服務器上打開它,並且一次請求一行 - 因爲它不是本地的,每個請求所花費的時間比文件位於硬盤上的時間要長得多。最好的選擇可能是首先使用Paramiko的SFTP get將文件複製到本地位置。

完成之後,您可以使用os.open從本地位置打開文件。

+0

感謝您的回覆@jozzas。我可以使用緩衝區大小或其他來改善它嗎?由於安全原因,本地獲取文件可能不是一個選項。 – Rinks

+0

@Rinks你可以嘗試使用緩衝區大小 - 嘗試使它變得非常大(50000?),然後用當前的方法試驗這個,並且調用readlines()來立即獲取文件中的所有行而不是請求一次一行。這可能需要一段時間,但一旦完成,循環播放的內容應該更快。你需要做一些實驗來看看哪些效果最好。 – jozzas

+0

再次感謝@jozzas。我嘗試了50000的緩衝區大小,它比默認值更好。但是,與當地相比,情況仍然糟糕得多。可能不得不以某種方式嘗試本地。 – Rinks

2

這是一種使用在paramiko中刮取命令行(cat)並一次讀取所有行的方法。適用於我:

import paramiko 

client = paramiko.SSHClient() 
client.load_system_host_keys() 
client.set_missing_host_key_policy(paramiko.WarningPolicy()) 
client.connect(hostname=host, port=port, username=user, key_filename=ssh_file)    

stdin, stdout, stderr = client.exec_command('cat /proc/net/dev') 
net_dump = stdout.readlines() 
#your entire file is now in net_dump .. do as you wish with it below ... 
client.close() 

我打開的文件很小,所以這一切都取決於您的文件大小。值得一試:)