linux - 构建一个包含大字符串的文件

标签 linux string unix text large-files

我们需要构建一个大约 1MB 的大型文本文件。我们尝试使用 Echo 使用 shell 脚本来使用 do 循环创建文件。构建时间很长。

我希望在 unix/Linux 中构建文件 1 行/记录。它可能是一个 1MB 大小的大字符串。

内容可能看起来像这样,但对于整个兆字节:

XXXXXXXXX............................................XXXX

如果我逐个字符构建,则需要更长的时间。

我想将其扩展到 10MB、20MB .... 60MB。

shell 脚本是最好的选择,还是有更快的选择?

最佳答案

unix dd 命令正是为此目的而设计的。

http://en.wikipedia.org/wiki/Dd_%28Unix%29

您可以编写一个小程序来连续将您想要的填充字符(在您的示例中为 X)打印到 STDOUT 而无需换行。将结果通过管道传输到 dd 并指定 bscount 参数,以便您获得完全正确的文件大小。

然后您可以调整 bscount 参数来找到最大吞吐量。

编辑:示例:

yes X | awk '{ printf("%s", $0)}' | dd of=out.txt bs=1024 count=1024 2>/dev/null

你可以看到它相当快:

time yes X | awk '{ printf("%s", $0)}' | dd of=out.txt bs=1024 count=1024 
1024+0 records in
1024+0 records out
1048576 bytes (1.0 MB) copied, 0.123118 s, 8.5 MB/s

real    0m0.127s
user    0m0.144s
sys         0m0.004s

通过管道的不同部分移动 time 向我表明 dd 正在接受您提供的任何内容,但生产者不是很快。 (也许 yesawk 不是最佳组合)。

如果您需要比这更快,也许您需要考虑其他接口(interface),例如 mmap

关于linux - 构建一个包含大字符串的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18028820/

相关文章:

linux - 如何在 Fedora 中通过终端查找特定文件夹

java - 从 String 中删除不适合 UTF-8 编码的字符

c++ - C++计算中的时间

linux - Bash - 为什么 sfdisk 在此脚本中不起作用?

linux - 发送最近的文件附件

linux - 对存储在目录中的文件执行正则表达式

java - 格式良好的 java 字符串

C++ - 在字符和文本之间获取文本字符串

linux - 使用 cat 和 tee 添加文件时的奇怪行为

unix - 从 C/C++ 应用程序启动 systemd 服务或调用 D-Bus 服务