2011-01-24 34 views
16

मेरे पास एक ऐसा प्रोग्राम है जो कुछ फ़ाइलों को बदलने के लिए मॉनीटर करता है। जैसे ही फ़ाइल अपडेट हो जाती है, फ़ाइल संसाधित होती है। अब तक मैं आर में "वास्तविक समय विश्लेषण" सौंपने के इस सामान्य दृष्टिकोण के साथ आया हूं। मैं उम्मीद कर रहा था कि आपके पास अन्य दृष्टिकोण हैं। शायद हम उनके फायदे/नुकसान पर चर्चा कर सकते हैं।वास्तविक समय में फ़ाइल (ओं) में परिवर्तनों की निगरानी

monitor <- TRUE 
start.state <- file.info$mtime # modification time of the file when initiating 

while(monitor) { 
    change.state <- file.info$mtime 
    if(start.state < change.state) { 
    #process 
    } else { 
    print("Nothing new.") 
    } 
    Sys.sleep(sleep.time) 
} 
+0

सामान्यतः, यह ठीक हो सकता है, लेकिन जब तक आप लूप को मार नहीं देते तब तक यह आर इवेंट लूप को हॉग करेगा। यह पृष्ठभूमि में नहीं चल रहा है, उदाहरण के लिए, आपको काम पर जाने की इजाजत देता है। यदि आप प्रक्रिया को चलाना छोड़ सकते हैं तो ठीक है, लेकिन मुझे नीचे दिए गए क्रॉन जॉब आरस्क्रिप्ट उत्तर पसंद है। –

+2

क्या आप फ़ाइल को अपडेट करने में आर स्क्रिप्ट चलाने के लिए कॉल नहीं कर सकते? – James

+0

@ जेम्स, जो करने योग्य हो सकता है, लेकिन मुझे जांच करनी होगी। –

उत्तर

7

सिस्टम एपीआई का उपयोग करने के सुझाव के समान, यह qtbase (https://r-forge.r-project.org/R/?group_id=454) का उपयोग करके भी किया जा सकता है जो एक क्रॉस-प्लेटफॉर्म होगा आर के भीतर से मतलब है:

dir_to_watch <- "/tmp" 

library(qtbase) 
fsw <- Qt$QFileSystemWatcher() 
fsw$addPath(dir_to_watch) 

id <- qconnect(fsw, "directoryChanged", function(path) { 
    message(sprintf("directory %s has changed", path)) 
}) 

cat("abc", file="/tmp/deleteme.txt") 
6

यदि आपका सिस्टम फाइल सिस्टम परिवर्तनों की निगरानी के लिए एक एपीआई प्रदान करता है, तो आपको इसका उपयोग करना चाहिए। मेरा मानना ​​है कि मैक इसके साथ आते हैं। हालांकि अन्य प्लेटफार्मों के बारे में निश्चित नहीं है।

संपादित करें: एक त्वरित goog मुझे दिया:

लिनक्स - http://wiki.linuxquestions.org/wiki/FAM

Win32 - http://msdn.microsoft.com/en-us/library/aa364417(VS.85).aspx

जाहिर है, इन API किसी भी मतदान है कि आप की आवश्यकता को समाप्त होगा। दूसरी तरफ, वे हमेशा उपलब्ध नहीं हो सकते हैं।

जावा इस है: http://jnotify.sourceforge.net/ और http://java.sun.com/developer/technicalArticles/javase/nio/#6

+4

लिनक्स पर, 'gamin' और' inotify' चाल कर सकते हैं। http://www.noah.org/wiki/FAM,_Gamin,_inotify – aL3xa

+0

ये नए और बेहतर समर्थित प्रतीत होते हैं। धन्यवाद एएल 3 एक्सए। – jetru

+1

'गिट स्टेटस - एस्पेलसेन 'यह भी देखने के लिए हैश को जांचता है कि कौन सी फाइलें बदली गई हैं, स्क्रिप्ट द्वारा पारदर्शी रूप में आउटपुट के साथ। आपको फ़ाइलों को स्थापित करने की आवश्यकता होगी ताकि उन्हें गिट द्वारा ट्रैक किया गया हो। –

6

मेरे मन में एक हैक है: आप सेटअप एक क्रॉन जॉब/अनुसूचित कार्य आर स्क्रिप्ट चलाने के लिए कर सकते हैं कि हर n सेकंड (या जो भी)। आर स्क्रिप्ट फ़ाइल हैश की जांच करता है, और यदि हैश मेल नहीं खाते हैं, तो विश्लेषण चलाता है। आप digest::digest फ़ंक्शन का उपयोग कर सकते हैं, बस मैन्युअल देखें।

3

यदि आपके पास ऐसी कई फ़ाइलें हैं जिन्हें आप मॉनिटर करना चाहते हैं, तो आर इस उद्देश्य के लिए बहुत धीमी हो सकती है। अपने c: या / डीआईआर पर जाएं और देखें कि file.info(dir(recursive = TRUE)) पर कितना समय लगता है। एक डॉस या बैश स्क्रिप्ट तेज हो सकती है।

अन्यथा, कोड ठीक दिखता है।

+0

मेरे पास हमेशा दिमाग है, यह समस्या है ... =) बैश स्क्रिप्ट फ़ाइल हैश की जांच कर सकती है और यदि आवश्यक हो तो आर स्क्रिप्ट चला सकती है। यह निश्चित रूप से एक बेहतर समाधान है। – aL3xa

+0

मैं केवल कुछ फाइलों की निगरानी करूँगा। –

3

आप tcltk2 पैकेज में tclTaskSchedule समारोह इस्तेमाल कर सकते हैं एक समारोह है कि अपडेट की जांच करने के लिए और अपने कोड चलाता है स्थापित करने के लिए। यह तब नियमित आधार पर चलाया जाएगा (आप समय निर्धारित करते हैं) लेकिन फिर भी आप अपने आर सत्र का उपयोग करने की अनुमति देंगे।

संबंधित मुद्दे