【发布时间】:2015-09-09 19:32:18
【问题描述】:
我要puts大量数据到TCL中的一个文件,而且耗时很长。我尝试使用fconfigure 将缓冲区容量从 4KB 增加到 1MB,但没有发现任何改进。
我不确定是否可以每隔一段时间 flush 我的缓冲区,因为我猜如果这样做,我的一些数据会丢失。
有没有什么方法可以在不丢失任何数据的情况下提高 put 的速度?
【问题讨论】:
我要puts大量数据到TCL中的一个文件,而且耗时很长。我尝试使用fconfigure 将缓冲区容量从 4KB 增加到 1MB,但没有发现任何改进。
我不确定是否可以每隔一段时间 flush 我的缓冲区,因为我猜如果这样做,我的一些数据会丢失。
有没有什么方法可以在不丢失任何数据的情况下提高 put 的速度?
【问题讨论】:
通常,输出速度会受到磁盘驱动器速度和计算机系统 i/o 带宽的限制。
增加缓冲区大小可能是您唯一可以做的事情。
flush 会减慢写入速度,因为它会将写入缓冲区强制推送到操作系统。
如果您的传入数据流暂停或进入一个可以放入内存的大块,您可以在内部缓冲传入的数据,并让写入稍后赶上。
【讨论】:
如果您的数据来自另一个通道(文件、套接字等),那么您可以使用fcopy 将其移动。 fcopy 命令尽可能高效地工作,如果您将双方(传入和传出)配置为使用二进制数据传输 - 所以 no 编码转换或 EOL/EOF 字符处理 - 然后它可以用最少的数据副本来做到这一点;它与用户进程级系统可以复制数据一样有效(并且您必须进行黑客操作才能将副本移动到操作系统内核中才能做得更好)。显然,必须处理编码转换和行尾标记的转换会减慢速度。
否则,主要瓶颈仍然(可能)是正在写入输出的设备。如果要写入文件,则写入 SSD 是最简单的选择(但不一定是最便宜的!)通过网络写入时,更好的网络将产生巨大的影响。您确实必须确定真正的瓶颈是什么;如果 Tcl 将大部分时间都花在等待硬件上,那么努力使 Tcl 更快就没有什么意义了,因为您几乎看不到这项工作的任何结果。修复硬件瓶颈超出了 Stack Overflow 的范围,尽管一些姊妹网站可能会提供帮助。
puts 不会丢失数据,除非你做了一些非常邪恶的事情,比如对进程执行强制终止 (kill -9),或者从 C 代码重置文件指针的位置。
【讨论】: