读取用 Python Paramiko SFTPClient.open 方法打开的文件很慢

Chu*_* Lu 4 python ssh sftp paramiko netcdf

我正在尝试远程读取 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)
Run Code Online (Sandbox Code Playgroud)

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

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

Mar*_*ryl 5

调用SFTPFile.prefetch应该会提高读取速度:

ncfile = sftp_client.open('mynetCDFfile')
ncfile.prefetch()
b_ncfile = ncfile.read()
Run Code Online (Sandbox Code Playgroud)

另一个选项是使用以下bufsize参数启用读取缓冲SFTPClient.open

ncfile = sftp_client.open('mynetCDFfile', bufsize=32768)
b_ncfile = ncfile.read()
Run Code Online (Sandbox Code Playgroud)

(32768是 的值SFTPFile.MAX_REQUEST_SIZE)

同样对于写入/上传:
写入使用 pysftp "open" 方法打开的 SFTP 服务器上的文件很慢


另一种选择是明确指定要读取的数据量(它使BufferedFile.read代码路径更有效):

ncfile = sftp_client.open('mynetCDFfile')
b_ncfile = ncfile.read(ncfile.stat().st_size)
Run Code Online (Sandbox Code Playgroud)

如果这些都不起作用,您可以将整个文件下载到内存中:
使用 pdfplumber 和 Paramiko 从 SFTP 服务器读取 PDF 文件


强制性警告:不要使用AutoAddPolicy这种方式 -这样做将失去对MITM 攻击的保护。有关正确的解决方案,请参阅Paramiko“未知服务器”

  • 很有帮助!谢谢 (3认同)