我有一段可以运行的 Python 代码,但是将 Dataframe 直接写入 SFTP 位置的速度非常慢。我正在使用 pysftp 和 pandas.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.open
的 bufsize
参数:
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/