2

我有一个 linux VM,每 4 小时更新一次新的数据文件。这些文件按编号 01 到 10 组织在目录中。

我有一个可执行文件(convert.exe),可以将上传的文件转换为不同的文件类型。

我想开发一个管道来处理文件(convert.exe),然后将它们重定向到另一个目录。

我已经在 linux bash 脚本中对它进行了系列编程。使用以下代码:

for d in $(find /mnt/data01/dpad -mindepth 1 -name "DIR*" -type d); do

  #recursively iterate through files
  #for those that were modified within the last day (i.e. new files added)
  for f in $(find $d -type f -mtime -1); do

    #determine appropriate folder for file to move to
    newdirname=$(basename $d)
    newfilename=$(basename $f)

    mono convert.exe $f -o /mnt/convertedfiles/$newdirname/$newfilename
  done
done

但是,我想使用我可以访问的处理能力并在多个 CPU 上并行运行它,以获得更多的实时转换方法和结果。

我打算改用 python 并使用snakemake 来分发命令。

我对编程并不陌生,但对命令很python陌生snakemake

只是想知道是否有人可以提供一些关于如何开始这个过程的见解?

4

2 回答 2

1

您可能需要使用osthreadingmultiprocessingsubprocess模块。

您需要做的第一件事是获取要处理的文件列表。您可以os为此使用该库。 os.listdir会给你一个目录的内容。 os.walk将递归迭代目录的内容(和子内容)。

import os
import subprocess
import multiprocessing

filepaths = []
for root, dirnames, filenames in os.walk('/root/path'):
    for filename in filenames:
        if filename.endswith('.jpg'):
            filepaths.append(os.path.join(root, filename))

现在您有了要处理的文件名列表,您需要一个可以并行运行的函数。您还需要构造所有不同的参数集以传递给该函数(在本例中为输出文件名)

arguments = []
for src in filepaths:
    dst = os.path.join('/mnt/convertedfiles', 
                       os.path.dirname(os.path.basename(src)), 
                       os.path.basename(src))
    arguments.append({'src': src, 'dst': dst})

现在我们可以创建一堆进程,每个进程处理不同的数据集

def func(data)
    p = subprocess.Popen(['mono', 'convert.exe', data['src'], '-o', data['dst'])
    p.wait()

# Using 4 worker processes. If you don't specify a number, it defaults
# to the number of cpu cores you have.
pool = multiprocessing.Pool(4)
pool.map(func, arguments)
于 2016-06-17T18:40:37.760 回答
0
doit() {
  d="$1"
  for f in $(find $d -type f -mtime -1); do
    #determine appropriate folder for file to move to
    newdirname=$(basename $d)
    newfilename=$(basename $f)

    mono convert.exe $f -o /mnt/convertedfiles/$newdirname/$newfilename
  done
}
export -f doit
find /mnt/data01/dpad -mindepth 1 -name "DIR*" -type d | parallel doit
于 2016-06-18T23:55:07.653 回答