Python 使用并行程序运行html2text

Python 使用并行程序运行html2text,python,html,linux,terminal,parallel-processing,Python,Html,Linux,Terminal,Parallel Processing,我正在使用html2text,从中我可以使用for file in*.html在文件夹中的所有.html文件上运行它;执行html2text“$file”>“$file.txt”;完成了,但速度有些慢。如何在我所有的.html文件上使用html2text和parallel?最初的答案是: for file in *.html do html2text "$file" > "$file.txt" & done 命令末尾的&符号告诉bash将命令放在后台,并将控制权返回调用

我正在使用
html2text
,从中我可以使用
for file in*.html在文件夹中的所有
.html
文件上运行它;执行html2text“$file”>“$file.txt”;完成了
,但速度有些慢。如何在我所有的
.html
文件上使用html2text和parallel?

最初的答案是:

for file in *.html
do
    html2text "$file" > "$file.txt" & 
done
命令末尾的&符号告诉bash将命令放在后台,并将控制权返回调用位置

不确定它是否能很好地处理1000个文件,因为它会为每个文件生成一个新的进程


然而,由于OP要求它可以处理数百万个文件,这显然是不可行的,因为它会产生数百万个后台进程,可能会挂起机器

您必须了解的是,处理数百万个文件将需要更多的时间,具体取决于您的硬件和操作系统限制。技术上比单个文件多一百万倍。 上面的答案似乎可以立即处理100个文件,这是因为您立即得到了命令提示符。但是,这并不意味着工作在那一点上就完成了,因为所有这些后台进程在完成之前可能仍在工作,即使您可以同时执行其他操作

从理论上讲,您可以将文件列表划分为块并逐块工作,但是,在测试此方法之后,我认为您不会比并行处理更快地得到最终结果

因此,根据您必须处理的文件数量,我建议您根据自己的发现并行运行,但可能会大幅调整并行作业的数量。

因此,类似这样的方法应该有效:

find . -type f -name \*html > FLIST
parallel --a FLIST -j 1000 'html2text {} > {.}.txt'
注意,这是OP的Python版本html2text的语法。有关使用Ubuntu发行版可用的html2text二进制软件包的选项,请参阅前面的答案编辑

这将在1000个并行文件的块中完成html,而不使用管道(这有时会大大降低速度)


如果速度太慢,试着将-j增加到10000——但这样你就陷入了硬件/操作系统的限制,即一直产生10000个并行进程。

对于其他处于类似情况的人,使用
并行
可以将时间减少一半以上。

你有权访问并行硬件吗,首先?什么硬件?@mrM不,它不是,它在正确的位置有一个&符号,如果你费心去读答案我的错误,你的代码几乎立刻就输出了html2text。谢谢你,伙计!Gnudiff您的代码可以在100个文件上立即工作,但当我在数百万个文件上测试时,它会以某种方式减慢速度。有没有一种方法可以设置文件块,或者将我的1000000个文件分成每个文件夹100个文件,然后在每个文件夹上运行此代码?我想了一下,是的,有一种方法,我会稍后在计算机上发布,当我运行第二行代码时,我得到了
parallel:Error:一个信号量既不接受stdin也不接受文件的输入
你有没有试过我的答案的更新版本,有没有试过调整-j参数?我试过Ubuntu存储库中的版本&即使在调整之后,它也非常糟糕,有问题。Github的html2text版本更好,并行将时间减少了约2-3倍。Gnudiff是否可以在转换后删除每个
.html
文件?当运行FLIST-j4'html2text{}>{.}.txt'并行时,原则上这是另一个问题,但应该是可能的,我将添加详细信息。如果我的答案对你有效,顺便说一句,请接受它。这应该可以在处理后删除文件,但只有在html2text成功退出(处理文件时没有错误)时才有效:parallel--a FLIST-j 1000'html2text{}>{.}.text&&rm{}'