2017-07-28 2 views
0

J'utilise un produit EDA. Ce produit donne une API, quelle entrée je voudrais. Cependant, la sortie est soumise à un gestionnaire de fichiers. I.e. .:Poignée de fichier de tuyau TCL pour éviter le ralentissement de l'accès au disque

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

Cela signifie que si je veux faire plus crissement, je dois lire ce qui est entrée dans la poignée de fichiers, après le processus d'écriture est terminée, ou risque d'un algorithme O (2). Les données peuvent être énormes, et notre système de filtrage est lent/surchargé/hors-quota (ou une combinaison). Existe-t-il un moyen pour "attraper" les données qui doivent être générées dans le descripteur de fichier, en créant un gestionnaire de fichier qui ne génère rien dans le système de fichiers? Idéalement, je voudrais quelque chose comme ceci:

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

Merci.

Répondre

1

Une option (Tcl 8.5 et ultérieure) serait de créer un "canal réfléchi", qui est un canal en mémoire. La page wiki listée ci-dessous contient des exemples complets.

En supposant que votre produit EDA soit toujours bloqué sur 8.4 (ce qui est assez ancien), vous devrez utiliser un fichier ou un tube standard.

Vous ne mentionnez pas le système d'exploitation sur lequel vous êtes. Sur unix, vous pouvez créer un tube nommé. Bien que cela utilisera le système de fichiers, le fichier devrait rester suffisamment petit pour rester en mémoire tout le temps.

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 

Apparemment, Windows a également été nommé tuyaux accessibles via une API interne, ils sont donc un peu plus difficile à utiliser (et je ne les ai jamais utilisé).

Si vous ne disposez pas d'un tube nommé, vous aurez probablement besoin d'utiliser un fichier:

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 

Références: refchan; wiki: reflected channel; chan; fileevent; fconfigure

+0

S'il y a beaucoup de données produites, il peut être plus simple d'utiliser simplement beaucoup d'espace disque. –