我有〜40GB的文件,以及一个过滤器命令,当我尝试在文件上运行它时(即使通过管道传递),由于某种原因它会中断。
但。当我将输入文件拆分为许多小文件,通过过滤器传递每个文件并连接输出时,它不会失败。
所以,我正在寻找一种方法:
- 将文件拆分成小块(10MB?)
- 对每个块运行一些命令
- 以正确的顺序连接输出
但没有先完全拆分文件(我不想使用那么多磁盘空间)。
我可以自己编写这样的程序,但也许已经有一些东西可以满足我的需要?
我有〜40GB的文件,以及一个过滤器命令,当我尝试在文件上运行它时(即使通过管道传递),由于某种原因它会中断。
但。当我将输入文件拆分为许多小文件,通过过滤器传递每个文件并连接输出时,它不会失败。
所以,我正在寻找一种方法:
但没有先完全拆分文件(我不想使用那么多磁盘空间)。
我可以自己编写这样的程序,但也许已经有一些东西可以满足我的需要?
如果您决定自己编写它并且您正在讨论文本文件,您可以将 Perl 与Tie::File模块一起使用。这使您可以一次就地处理大文件。它只是为了这种事情。
如果文件也不是文本,您可以尝试Tie::File::AnyData 。
编辑:刚刚注意到您不想因为磁盘空间而提前拆分文件,这可能对您不起作用
使用拆分:
我建议使用 sed 仅提取您想要的部分并将输出通过管道传输到您的命令中:
将前 1000 行通过管道传输到您的命令
将管道接下来的 1000 行。
等等
如果需要,您可以将其放入脚本中的循环中。
例如
尝试这个:
好吧 - 对于每个建议编写我自己的解决方案的人。我可以。而且我什至可以在没有多次“扫描”输入文件的情况下做到这一点。但问题/问题是:有没有现成的工具?
最简单的基于 Perl 的方法可能如下所示:
现在我可以:
你不是第一个遇到这个问题的人
iconv
。有人写了一个Perl 脚本来解决它。iconv
不能很好地处理大文件。从 glibc 源代码,在iconv/iconv_prog.c
:但是,对于您的特定情况,编写自己的 UTF-8 验证器可能会更好。您可以轻松地提炼
iconv -c -f utf8 -t utf8
成一个小的 C 程序,其中包含一个调用iconv(3)
. 由于 UTF-8 是无模式和自同步的,因此您可以分块处理它。