2017-07-28 42 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

如果有很多數據正在生成,那麼使用大量磁盤空間可能會更簡單。 –