使用 SFTP 上传许多小文件速度缓慢

2024-01-06

当使用SFTP上传100个每个100字节的文件时,这里需要17秒(after连接建立了,我什至没有计算初始连接时间)。这意味着仅传输 10 KB 需要 17 秒,即 0.59 KB/秒!

我知道发送 SSH 命令到open, write, close等可能会产生很大的开销,但仍然,使用 SFTP 发送许多小文件时,有没有办法加快进程?

或者特殊模式paramiko / pysftp将所有要执行的写入操作保留在内存缓冲区中(假设最后 2 秒的所有操作),然后在 SSH/SFTP 的一次分组传递中执行所有操作?这将避免每次操作之间等待 ping 时间。

Note:

  • 我的连接上传速度约为 100 KB/s(测试为 0.8 Mbit 上传速度),到服务器的 ping 时间为 40 毫秒
  • 当然,如果我不是发送 100 个 100 字节的文件,而是发送 1 个 10 KB 字节的文件,则需要
  • 我不想在远程运行二进制程序,只接受 SFTP 命令
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)

使用以下方法(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())

我将探索源代码,但我仍然不知道它是否将许多操作分组到几个 SSH 事务中,或者它是否只是并行运行命令。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 SFTP 上传许多小文件速度缓慢 的相关文章

随机推荐

  • Django - 在基于类的视图上使用reverse()

    我的 Django 项目中有以下 url 配置 urlpatterns patterns r my view MyViewClass as view 有没有办法使用reverse 函数获取上面视图的url 就在这里 Use the name
  • TransactionScope 和 Npgsql - 准备好的事务问题

    我有以下代码 using TransactionScope tScope new TransactionScope using NpgsqlConnection myConnection new NpgsqlConnection MyCon
  • 将 RecyclerView 锚定在折叠工具栏布局上稍高的位置 [重复]

    这个问题在这里已经有答案了 是否可以将 RecyclerView 锚定在比通常位置高一点的位置 就像大多数可折叠视图上的 FAB 图标一样 有关预期结果 请参见图 1 Image 1 我尝试了以下代码 但它没有给出预期结果 有关当前结果 请
  • 批量分配令牌

    我有以下问题 我正在从数据库中读取字段 这些字段并非都是必填字段 因此 并非所有内容都已填写 我遇到的问题是 Batch ms dos 和 Tokens 函数 让我举一个例子 有问题的字段如下 示例 First Name John Last
  • 如何在 XAML 中注入转换器

    我有一个 IValueConverter 实现的类 我需要使用我的 DI 容器 Ninject 注入它 问题是 在 XAML 中 没有立即明显的方法来控制 Converter 对象的实例化 所以我的 XAML 包含这样一行 Source 绑
  • for 循环的限制是计算一次还是每次循环都计算?

    以下循环中的限制 12332 324234 是计算一次还是每次循环运行时计算 for int i 0 i lt 12332 324234 i Do something 为此 计算一次 或更可能计算 0 次 编译器将为您优化乘法 然而 如果你
  • 发布者订阅者模式的现代替代方案

    我有一个 C Windows 应用程序 我正在处理发布者 订阅者的情况 其中我的一个类 发布者 定期生成数据并将其传递给另一个类 订阅者 该类不断等待接收来自发布者的通知 我是设计模式的新手 我查找了发布者订阅者模型的常见实现 我注意到它们
  • jquery 如果鼠标悬停

    我有一个带有悬停功能的 img 来显示元素 其中一些新元素与 img 重叠 因此如果我将鼠标悬停在新元素上 因为光标不再位于 img 上 该元素会隐藏自身 然后立即重新出现 因为光标再次位于 img 上 如果光标位于新元素内的 img 上
  • Pandas,groupby 并找到组中的最大值,返回值和计数

    我有一个带有日志数据的 pandas DataFrame host service 0 this com mail 1 this com mail 2 this com web 3 that com mail 4 other net mai
  • 是否可以在 Firebase 托管上托管 Express 和 socket.io 应用程序?

    我关注 Firebase 云功能已经有一段时间了 最近 我发现在 Firebase Hosting 上托管 Node js 应用程序 但它仅使用 Express 我们可以在 Firebase 上托管 socket io 应用吗 Fireba
  • 部分 Fragment 项目隐藏在操作栏下

    我正在学习 android 开发 我的问题可能很简单 我被困在下面的部分并请求你的帮助 描述 我正在使用android默认的 导航抽屉 活动来实现一个小项目 我创建了一个片段 当用户从导航抽屉中选择一个选项时 该片段将打开 面临的问题 Wh
  • Python3 - Matplotlib FuncAnimation 连续内存泄漏

    EDIT2 因此 经过更多的工作 我创建了最小的样本 它在每台机器上都相当不错地重现了 Memoryleak 这段代码只是创建一个 TKinter 窗口和一个带有 3 个正弦波的 matplotlib 画布 然后尝试制作动画 看到 blit
  • 在 laravel 8 上安装 laravel/jetstream 失败

    通过composer安装jetstream后composer require laravel jetstream然后突然得到一个ErrorException 没有这样的文件或目录 Writing lock file Generating o
  • 使用 JAXB 解组 XML

    我有一个 XML 文件 我正在尝试对其进行解组 但我不知道如何执行此操作 XML 看起来像
  • 致命错误:webp 不支持调色板图像

    我保存的是png图像webp使用以下代码格式化但有时显示 致命错误 webp 不支持调色板图像 所以 请给我建议 im imagecreatetruecolor 120 20 text color imagecolorallocate im
  • 如何在没有手动限制的情况下在一侧扩展 ggplot 条形刻度而不是另一侧

    目标是消除刻度线和条形底部之间的空间 而不切断条形另一端之外的任何百分比标签 我正在使用 R 的 ggplot2 运行数十个条形图 并尝试遵循我们的组织风格指南 该指南是使用 Excel 手动为每个图表开发的 不同图表中的最大长度条的长度不
  • 在服务器端为 ColdFusion 实现 Showdown.js markdown 解析器

    这是一个 事实调查 问题 旨在了解使用以下命令创建 ColdFusion UDF 来解析服务器上的 markdown 有多困难 showdown js 解析器 http attacklab net showdown 已经有一个利用 show
  • 如何激活Dataflow Shuffle服务?

    我正在尝试使用数据流洗牌服务 https cloud google com dataflow service dataflow service desc cloud dataflow shuffle在 python 环境中 但似乎 shuf
  • 寻求 ggplot 2.2.0 破坏的 gtable_add_grob 代码的解决方法

    在具有多个方面变量的图中 ggplot2 重复 外部 变量的方面标签 而不是在 内部 变量的所有级别上使用单个跨越方面带 我有一些代码 我一直在使用这些代码来使用单个跨越小平面条来覆盖重复的外小平面标签gtable add grob来自gt
  • 使用 SFTP 上传许多小文件速度缓慢

    当使用SFTP上传100个每个100字节的文件时 这里需要17秒 after连接建立了 我什至没有计算初始连接时间 这意味着仅传输 10 KB 需要 17 秒 即 0 59 KB 秒 我知道发送 SSH 命令到open write clos