2011-09-27 169 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() 

我打开的文件很小,所以这一切都取决于您的文件大小。值得一试:)