Hier ist ein Arbeitsbeispiel, das eine Testdatei auf Ihrem lokalen Rechner kopiert. Die Datei ist viel kleiner als 1 GIG, gibt aber den allgemeinen Plan.
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"
Laufen auf meinem Rechner habe ich
Enter password:
writing test file...
file size 25000000, 21017 KB/Sec
copying file...
10.225 seconds, 2387 KB/Sec
Wir erwarten, dass einige langsam nach unten, weil es ein Lese- und ein Schreib-und Netzkosten (sein zu lokalen Host so, dass es nicht den Draht berühren) , aber das scheint irgendwie langsam. Ich benutze einen Low-Power-Laptop mit 2 Kernen und zwischen dieser App und sshd, verwendet viel von der CPU, vermutlich um die Verschlüsselung zu tun. Eine Maschine mit höherer Leistung funktioniert möglicherweise besser.
Wahrscheinlich so etwas wie http://www.programcreek.com/python/example/618/shutil.copyfileobj, 'copyfileobj (sftp_file, öffnen ('save.csv', 'wb'), 1024)' – sal
I Ich bin verwirrt über Ihre Namenskonventionen ... 'server_address' enthält den Namen der Remote-Datei? Dann sollte 'shutil.copyfileobj (sftp_file, open ('localfile', 'wb'))' es tun. Sie können eine bessere Leistung finden, indem Sie eine größere Blockgröße angeben (zB 'blocksize = 1048576' dann' shuthil.copyfileobj (sftp_file, offen ('localfile', 'wb', blocksize), Blockgröße) ' – tdelaney
@tdelaney Danke, ja ich korrigierte das, um klarer zu sein – rlartiga