Bas*_*asj 3 python ssh sftp paramiko pysftp
当用SFTP上传100个每个100字节的文件时,这里需要17秒(建立连接后,我什至没有计算初始连接时间)。这意味着仅传输 10 KB 就需要 17 秒,即 0.59 KB/秒!
我知道向open、write、close等发送 SSH 命令可能会产生很大的开销,但是,在使用 SFTP 发送许多小文件时,有没有办法加快该过程?
或者特殊模式paramiko或者/pysftp将所有要执行的写入操作保留在内存缓冲区中(假设最后 2 秒的所有操作),然后在 SSH/SFTP 的一次分组传递中执行所有操作?这将避免每次操作之间等待 ping 时间。
笔记:
import pysftp, time, os
with pysftp.Connection('1.2.3.4', username='root', password='') as sftp:
with sftp.cd('/tmp/'):
t0 = time.time()
for i in range(100):
print(i)
with sftp.open('test%i.txt' % i, 'wb') as f: # even worse in a+ append mode: it takes 25 seconds
f.write(os.urandom(100))
print(time.time() - t0)
Run Code Online (Sandbox Code Playgroud)
使用以下方法(100 个异步任务),它在大约 0.5 秒内完成,这是一个巨大的改进。
import asyncio, asyncssh # pip install asyncssh
async def main():
async with asyncssh.connect('1.2.3.4', username='root', password='') as conn:
async with conn.start_sftp_client() as sftp:
print('connected')
await asyncio.wait([sftp.put('files/test%i.txt' % i) for i in range(100)])
asyncio.run(main())
Run Code Online (Sandbox Code Playgroud)
我将探索源代码,但我仍然不知道它是否将许多操作分组到几个 SSH 事务中,或者它是否只是并行运行命令。
| 归档时间: |
|
| 查看次数: |
3212 次 |
| 最近记录: |