Чтение файла, открытого с помощью Python Paramiko SFTPClient.open, происходит медленно - PullRequest
3 голосов
/ 17 октября 2019

Я пытаюсь удаленно прочитать файл 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 Ответ

2 голосов
/ 17 октября 2019

Вызов SFTPFile.prefetch должен увеличить скорость чтения:

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

Другой вариант - включить буферизацию чтения, используя параметр bufsize SFTPClient.open:

ncfile = sftp_client.open('mynetCDFfile', bufsize=32768)
b_ncfile = ncfile.read()

(32768 - это значение SFTPFile.MAX_REQUEST_SIZE)


Еще один вариант заключается в явном указании объема данных для чтения (он делаетBufferedFile.read используйте более эффективный путь кода):

ncfile = sftp_client.open('mynetCDFfile')
b_ncfile = ncfile.read(ncfile.stat().st_size)

Обязательное предупреждение: не используйте AutoAddPolicy таким образом - вы теряете защиту от MITM атакует тем самым. Для правильного решения см. Paramiko "Неизвестный сервер" .

...