【发布时间】:2020-10-24 18:05:35
【问题描述】:
我要解决的问题如下: 我有一台包含大量数据(约 5 TB)的台式计算机,我想对其进行分析。数据由 500k 个文件组成,每个文件都可以单独分析。 对于分析,我在大学有一系列可用的服务器,但是,服务器没有空间存储所有这些数据,也没有空间存储分析的输出。
所以我的想法是将数据分段复制到服务器,运行分析,将结果传输回桌面,删除服务器上的输入和输出数据,然后重复。
对于文件传输,我昨天安装了 paramiko,它似乎工作得很好:
remote_get = 'test'
local_deliver = './test'
ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.load_host_keys(os.path.expanduser(os.path.join("~", ".ssh", "known_hosts")))
ssh.connect(server, username=username, password=password)
sftp = ssh.open_sftp()
for root, dirs, files in os.walk(local_path):
for fname in files:
full_fname = os.path.join(root, fname)
full_remote = os.path.join(remote_path, fname)
sftp.put(full_fname, full_remote)
sftp.close()
ssh.close()
但是我唯一的问题是,我需要传输的数据量可能需要几天的时间来回传输,因此我希望尽可能异步启动数据传输,这样我就可以对数据进行分析当前数据集,同时传输下一个要分析的数据集。
但我不知道如何做这样的事情,谁能指出我正确的方向?
【问题讨论】:
-
您的意思是要手动启动工作并让多个线程/进程移动数据吗?还是您希望程序始终运行并在新文件到达桌面时让它复制文件?
-
我想手动启动它。输入数据量保持不变。
-
我不清楚异步传输如何帮助您实现目标。如果多个进程共享同一个线程并根据 FD 何时准备好进行读/写来进行调度,那么对于要同时复制的每个文件使用不同的线程无法做到这一点,您可以做什么? (而如果您一次不想复制多个文件,“异步给您带来了什么?”就变得更不清楚了)。
-
明白了。老实说,既然如此,我会考虑将工作分解为单独的流程。如果你有一个
transfer-and-process脚本,给定一个文件名,首先将文件复制到远程服务器,然后在那里处理它,像find . -type f -print0 | xargs -n 1 -P 5 ./transfer-and-process这样简单的东西就足够了。出于几个原因,这不是理想,但它是一个开始思考问题的地方;如果您的处理速度比传输速度快,更好的方法就是在远程端有一个脚本来监视目录中的新文件...... -
或者,您可以从服务器可以挂载的本地计算机打开一个网络共享(unix 风格的 NFS 或 windows 风格的 CIFS 挂载)。假设服务器只扫描和写入一次数据,则不会比复制更多开销。如果你想在服务器上预留数据,它可以在需要时从共享中复制。
标签: python asynchronous parallel-processing sftp paramiko