Вот рабочий пример, который извлекает копии тестового файла на вашем локальном компьютере. Файл намного меньше 1 GIG, но дает общий план.
import paramiko
import os
import shutil
import time
import getpass
# get params
user = getpass.getuser()
pwd = getpass.getpass("Enter password: ")
bufsize = 2**20
host = 'localhost'
test_file_lines = 1000000
# create test file
now = time.asctime()
testfile_path = os.path.abspath('deleteme')
local_path = 'deleteme.copy'
print('writing test file...')
start = time.time()
with open(testfile_path, 'w') as fp:
for _ in range(test_file_lines):
fp.write(now + '\n')
delta = time.time() - start
file_size = os.stat(testfile_path).st_size
print("file size %d, %d KB/Sec" % (file_size, file_size/1024/delta))
# make connection
ssh=paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.connect(host,username=user,password=pwd)
sftp=ssh.open_sftp()
sftp_file=sftp.open(testfile_path, bufsize=bufsize)
print('copying file...')
start = time.time()
shutil.copyfileobj(sftp_file,
open(local_path, 'wb', bufsize),
bufsize)
delta = time.time() - start
print('%.3f seconds, %d KB/Sec' % (delta, file_size/1024/delta))
#assert open(testfile_path).read() == open(local_path).read(), "files match"
Бег на моей машине я получил
Enter password:
writing test file...
file size 25000000, 21017 KB/Sec
copying file...
10.225 seconds, 2387 KB/Sec
Мы ожидаем, что некоторые замедляются, потому что есть чтение и запись а также сетевые затраты (его на локальный хост, так на самом деле не трогать провода) , но это кажется медленным. Я использую маломощный ноутбук с двумя ядрами, а между этим приложением и sshd, использовал большую часть процессора, предположительно, для шифрования. Более мощная машина может работать лучше.
Возможно, что-то вроде этого http://www.programcreek.com/python/example/618/shutil.copyfileobj, 'copyfileobj (sftp_file, open ('save.csv', 'wb'), 1024)' – sal
I 'confused о ваших соглашениях об именах ... 'server_address' содержит имя удаленного файла? Тогда 'shutil.copyfileobj (sftp_file, open ('localfile', 'wb'))' должен сделать это. Вы можете найти более высокую производительность, указав больший размер блока (например, 'blocksize = 1048576', затем' shutil.copyfileobj (sftp_file, open ('localfile', 'wb', blockize), blockize) ' – tdelaney
@tdelaney спасибо, да I исправил это, чтобы быть более ясным. – rlartiga