2017-07-28 5 views
0

Ich führe ein EDA-Produkt. Dieses Produkt gibt eine API, welche Eingabe ich gerne hätte. Die Ausgabe wird jedoch an ein Dateihandle übergeben. D.h .:TCL-Pipe-Dateihandle, um Festplatten-Verlangsamung zu vermeiden

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

Das bedeutet, dass, wenn ich mehr Knirschen tun will, muss ich lesen, was Eingang in die Datei-Handle ist, nachdem der Schreibvorgang beendet ist, oder ein O-Risiko (2) Algorithmus. Die Daten können enorm sein und unser Dateisystem ist langsam/überlastet/out-quota (oder eine Kombination). Gibt es eine Möglichkeit für mich, die Daten zu "fangen", die an das Datei-Handle ausgegeben werden sollen, indem Sie ein Datei-Handle erstellen, das nichts an das Dateisystem ausgibt? Im Idealfall möchte ich etwas wie dieses:

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

Danke.

Antwort

1

Eine Option (Tcl 8.5 und höher) wäre, einen "reflektierten Kanal" zu erstellen, der ein In-Memory-Kanal ist. Die unten aufgeführte Wiki-Seite enthält vollständige Beispiele.

Angenommen, Ihr EDA-Produkt ist immer noch auf 8.4 (das ist ziemlich alt) stecken, müssen Sie eine Standarddatei oder -rohr verwenden.

Sie erwähnen nicht, auf welchem ​​Betriebssystem Sie sich befinden. Unter Unix können Sie eine Named Pipe erstellen. Während dies das Dateisystem verwendet, sollte die Datei klein genug bleiben, damit sie die ganze Zeit im Speicher bleibt.

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 

offenbar auch von Windows hat Named Pipes über eine interne API zugegriffen wird, so dass sie ein bisschen schwieriger zu bedienen (und ich habe sie nie benutzt).

Wenn Sie nicht über eine Named Pipe haben, werden Sie wahrscheinlich eine Datei verwenden müssen:

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 

Referenzen: refchan; wiki: reflected channel; chan; fileevent; fconfigure

+0

Wenn viele Daten produziert werden, ist es möglicherweise einfacher, viel Speicherplatz zu verwenden. –

Verwandte Themen