python - 写入使用 Paramiko/pysftp "open"方法打开的 SFTP 服务器上的文件很慢

标签 python pandas file-upload sftp pysftp

我有一段可以运行的 Python 代码,但是将 Dataframe 直接写入 SFTP 位置的速度非常慢。我正在使用 pysftppandas.to_csv() 来实现从远程位置读取 Excel 文件、运行一些简单转换并将其写入 SFTP 的任务位置。

下面分享了代码片段,准确地说,需要 4 分 30 秒才能将 100 条记录写入 SFTP 位置。我处理的平均 Dataframe 最多有 20 列。

def dataframe_sftp_transfer(df,destination_path):
    cnopts = CnOpts()
    cnopts.hostkeys = None
    sftp = Connection('sftp3.server.com'
                    ,username= 'user'
                    ,password = 'pwd123'
                    ,cnopts=cnopts)
    with sftp.open(destination_path,'w+') as f:
        chunksize = 100
        with tqdm(total=len(df)) as progbar:
            df.to_csv(f,sep='~',index=False,chunksize=chunksize)
            progbar.update(chunksize)

是否有更好/更快的方法来实现上述目标?写入所述大小的文件不应该只需要几分钟吗?

使用 FileZilla 这样的工具将文件放入远程 SFTP 位置的速度要快得多,但遗憾的是,这会消除任何形式的自动化。

最佳答案

您无需缓冲即可打开远程文件。这样,每次 df.to_csv 写入文件时,Paramiko/pysftp 都会向 SFTP 服务器发送请求并等待响应。我不知道 df.to_csv 的内部结构,但它很可能每行写入一次(如果不是更多)。这就可以解释为什么上传这么慢了。特别是,如果您与服务器的连接延迟很高。

要启用缓冲写入,请使用 Connection.openbufsize 参数:

with sftp.open(destination_path, 'w+', 32768) as f:

对于读取/下载也是如此:
Reading file opened with Python Paramiko SFTPClient.open method is slow

<小时/>

强制警告:请勿设置cnopts.hostkeys = None,除非您不关心安全性。正确的解决方案请参阅 Verify host key with pysftp

关于python - 写入使用 Paramiko/pysftp "open"方法打开的 SFTP 服务器上的文件很慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58111798/

相关文章:

python - 表单配置不正确 - Django

python - 修复文本中的比较数据

python - 我们可以使用 Haar 分类器来检测眼睛的虹膜,就像检测面部和眼睛一样吗?

python - 如何使用 python 将 JSON 上传到谷歌云存储

python - 将 pandas DataFrame DatetimeIndex 延长 25 个工作日

python - 如何用特定的 Pandas 列值替换 n 个顶部和底部值

python - 如何在 mutate dplython 中使用正则表达式添加新列

c# - 如何在内存中创建Xml文件上传到服务器

php - 将多个文件上传到 FTP 并将文件的 HTTP 链接上传到 MySQL 数据库

javascript - 在 Javascript 中如何先执行 image.onload 函数,然后再继续其余过程