【发布时间】:2020-03-10 14:50:57
【问题描述】:
我想要一个支持用户可配置缓冲区的打印功能,因此只有在缓冲区大于阈值时才打印缓冲区中的内容。
我需要编写多个文件,所以我有多个文件句柄要写入,为此,面向对象的模块可能更方便。
我想像这样:
my $printer1 = Print::Buffer->new({ size => 1000, filehandle => \$OUT1 });
for (my $i=1; $i<1000; $i++) {
$printer1->print("This string will be eventually printed ($i/1000)");
}
# and at the end print the remaining buffer
$printer1->flush();
有什么推荐吗?我可能没有使用正确的关键字,因为我在 CPAN 中没有找到明确的匹配项。
更新: 感谢大家提供非常有用的 cmets。正如你们中的一些人所指出的,这个问题比我最初想象的要复杂,而且可能是个坏主意。 (当我在每次循环迭代时使用打印语句打印非常大的文件 [>100Gb] 时出现了这个问题,并指出如果我打印每百次迭代我有一个加速,但这可能取决于循环的方式变了……)
更新 2: 我需要/想要接受答案。对我来说,两者都很有启发性,而且都很有用。我对两者都进行了测试,它们都需要进一步的工作才能对改进进行基准测试(如果有的话,请参阅上面的更新)。 tie 句柄是我喜欢的一个鲜为人知的功能,这就是我接受它的原因。在我看来,它们都同样接近预期的答案。非常感谢大家的讨论和见解。
【问题讨论】:
-
我认为投反对票后可以花 10 秒时间发表评论,以便我可以尝试以更好的方式重新表述问题
-
投反对票可能是因为您要求推荐,这不是 Stack Overflow 的目的。
-
记录一下,你可以试试metacpan.org/pod/PerlIO::buffersize
-
请注意无缓冲的syswrite,您可以在自己的实用程序包装器/方法中使用它。请阅读并注意不要将其与缓冲操作混合的警告。我认为这个问题是合理的,即使它可能受益于描述的改进;投票重新开放。
-
@Brad Gilbert Re "文件句柄默认是缓冲的。虽然我认为它们是行缓冲的,而不是固定大小的缓冲区。",除了 STDOUT 和 STDERR 之外的文件句柄默认情况下是块缓冲的。 STDERR 没有缓冲。如果连接到终端,则 STDOUT 为线路缓冲,否则为块缓冲。 (请注意,每个 PerlIO 层可能有自己的缓冲区,因此向 STDERR 添加编码层将有效地使其成为缓冲。)
标签: perl buffer filehandle