加速将操作放到tcl中的文件中

Speeding up puts operation to file in tcl

我要puts大量的数据到TCL的一个文件中,这需要很长时间。我尝试使用 fconfigure 将缓冲区容量从 4KB 增加到 1MB,但发现没有任何改善。

我不确定我是否可以 flush 我的缓冲区,因为我猜如果我这样做的话我的一些数据会丢失。

有什么方法可以在不丢失任何数据的情况下提高 put 的速度?

通常输出速度将受到磁盘驱动器速度和计算机系统 i/o 带宽的限制。

增加缓冲区大小可能是您唯一可以提供帮助的方法。

flush 会减慢写入速度,因为它会将写入缓冲区强制推送到操作系统。

如果您的传入数据流暂停或以可放入内存的一大块形式传入,您可以在内部缓冲传入数据,让写入稍后赶上。

如果您的数据来自另一个通道(文件、套接字等),那么您可以使用 fcopy 来移动它。 fcopy 命令小心翼翼地尽可能高效地工作,如果您将双方(传入和传出)配置为使用二进制数据传输 — 所以 没有 编码转换或 EOL/EOF 字符处理——然后它可以用最少的数据副本来完成;它与用户进程级系统可以复制数据一样高效(并且您必须进行 hackery 操作才能将副本移动到 OS 内核中才能做得更好)。显然,必须处理编码转换和行尾标记的转换会减慢速度。

否则,主要瓶颈仍然(可能)是正在写入输出的设备。如果它是一个文件,转向写入 SSD 是最简单的选择(但不一定是最便宜的!)当通过网络写入时,更好的网络将产生巨大的差异。您真的必须确定真正的瓶颈是什么;如果 Tcl 花费大部分时间等待硬件,那么努力使 Tcl 更快就没有什么意义,因为您几乎看不到这项工作的任何结果。修复硬件瓶颈不在 Stack Overflow 的范围内,但一些姐妹网站可能会提供帮助。

puts 不会丢失数据,除非你做了一些非常邪恶的事情,比如在进程上强制终止 (kill -9),或者从 C 代码重置文件指针的位置.