Python Paramiko SFTPClient.open 方法打开文件后读取速度慢

11

我正在尝试远程读取一个netcdf文件。
我使用Paramiko软件包来读取我的文件,就像这样:

import paramiko
from netCDF4 import Dataset

client = paramiko.SSHClient()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(hostname=’hostname’, username=’usrname’, password=’mypassword’)

sftp_client = client.open_sftp()
ncfile = sftp_client.open('mynetCDFfile')
b_ncfile = ncfile.read()    # ****

nc = Dataset('test.nc', memory=b_ncfile)

但是ncfile.read()的运行速度非常慢。

因此我的问题是:是否有其他方法可以远程读取netcdf文件,或者是否有方法可以加快paramiko.sftp_file.SFTPFile.read()的读取速度?

1个回答

13

调用 SFTPFile.prefetch 应该会增加读取速度:

ncfile = sftp_client.open('mynetCDFfile')
ncfile.prefetch()
b_ncfile = ncfile.read()

另一个选项是启用读取缓冲,使用SFTPClient.openbufsize参数:
ncfile = sftp_client.open('mynetCDFfile', bufsize=32768)
b_ncfile = ncfile.read()

(32768是SFTPFile.MAX_REQUEST_SIZE的值)
同样地,对于写入/上传操作: 使用Paramiko/pysftp的"open"方法打开SFTP服务器上的文件进行写入操作是比较慢的。
另一个选择是明确指定要读取的数据量(这将使BufferedFile.read采用更高效的代码路径)。
ncfile = sftp_client.open('mynetCDFfile')
b_ncfile = ncfile.read(ncfile.stat().st_size)

如果以上方法都不起作用,您可以将整个文件下载到内存中:
使用pdfplumber和Paramiko从SFTP服务器读取PDF文件
强制警告:不要以这种方式使用AutoAddPolicy - 这样做会失去对中间人攻击的保护。正确的解决方案,请参见Paramiko "未知服务器"

3
非常有帮助!谢谢。 - Chun-Ye Lu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接