2017-07-28 59 views
0

我正在运行EDA产品。该产品提供了一个API,我想要哪个输入。但是,输出提交给文件句柄。即:TCL管道文件句柄以避免磁盘访问速度减慢

getFooData -elem <elem to query> -query <what is queried> -fh <file handle> 

这意味着,如果我想要做更多捣鼓,我需要读什么是文件处理输入,写作过程结束后,或风险的O(2)算法。 数据可能非常庞大,我们的文件系统缓慢/超载/超额配额(或组合)。 有没有办法让我“捕捉”应该输出到文件句柄的数据,方法是创建一些文件句柄,它不向文件系统输出任何内容?理想情况下,我想这样的事情:

getFooData -elem <elem to query> -query <what is queried> -fh $fh 
set m [ getLatestInputOfPipeFh $fh ] 

谢谢。

回答

1

一个选项(Tcl8.5和更高版本)将创建一个“反射通道”,这是一个内存通道。下面列出的wiki页面有完整的示例。

假设您的EDA产品仍然停留在8.4(这是很旧的),您将需要使用标准文件或管道。

你没有提及你的操作系统。在UNIX上,你可以创建一个命名管道。虽然这将使用文件系统,但文件应该保持足够小以至于始终保留在内存中。

proc processFooInput { fh } { 
    set data [gets $fh] 
    # process data 
    if {[eof $fh]} { 
     fileevent $fh readable {} 
    } 
} 

set pfn /tmp/fooData 
exec mkfifo -m 0666 $pfn 
set outfh [open $pfn w] 
set infh [open $pfn r] 
fconfigure $infh -blocking 0 -buffering line 
fileevent $infh readable processFooInput 
getFooData -elem <elem to query> -query <what is queried> -fh $outfh 

显然的Windows也命名管道通过内部API访问,所以他们有点难以用(我从来没有使用过)。

如果您还没有命名管道,你可能需要使用一个文件:

set sfn /var/tmp/fooData.tmp 
set outfh [open $sfn w] 
set infh [open $sfn r] 
fconfigure $infh -blocking 0 -buffering line 
fileevent $infh readable processFooInput 
getFooData -elem <elem to query> -query <what is queried> -fh $outfh 

参考文献:refchan; wiki: reflected channel; chan; fileevent; fconfigure

+0

如果有很多数据正在生成,那么使用大量磁盘空间可能会更简单。 –