2015-09-15 8 views
8

के लिए स्ट्रीमिंग डेटा मैं लगातार बदलती फ़ाइल तक पहुंचने के लिए पांडा के उपयोग को अनुकरण करने का प्रयास कर रहा हूं।पांडा डीएफ

मैं एक फ़ाइल csv फ़ाइल को पढ़ने, यह करने के लिए एक पंक्ति जोड़कर तो एक यादृच्छिक समय थोक इनपुट अनुकरण के लिए सो रहा है।

import pandas as pd 

while True: 
    df = pd.read_csv('data.csv', header=None, names=['Name','DATE']) 
    print(df.shape) 

जबकि मैं डीएफ के सही आकार हो रही है उस के साथ समस्या है, देखते हैं:

import pandas as pd 
from time import sleep 
import random 

df2 = pd.DataFrame(data = [['test','trial']], index=None) 

while True: 
    df = pd.read_csv('data.csv', header=None) 
    df.append(df2) 
    df.to_csv('data.csv', index=False) 
    sleep(random.uniform(0.025,0.3)) 

दूसरी फ़ाइल dataframe के आकार outputting द्वारा डेटा में परिवर्तन के लिए जाँच कर रहा है कुछ बार जहां यह (0x2) आउटपुट कर रहा है।

यानी .:

... 
(10x2) 
(10x2) 
... 
(10x2) 
(0x2) 
(11x2) 
(11x2) 
... 

यह होती है कुछ पर लेकिन आकार में प्रत्येक परिवर्तन (फ़ाइल dataframe को जोड़ने) के बीच नहीं।

इस जब पहली स्क्रिप्ट डेटा जोड़ने के लिए फ़ाइल खोल रहा है क्या होता है जानने के बाद, और दूसरे पटकथा इसे उपयोग करने में है, इसलिए (0x2) में असमर्थ है, यह किसी भी डेटा हानि कब होगा?

मैं सीधे धारा, केवल उत्पादन फ़ाइल का उपयोग नहीं कर सकते। या क्या कोई अन्य संभावित समाधान हैं?

संपादित

इसका उद्देश्य नए डेटा केवल (मैं एक कोड है कि करता है) "मक्खी पर" लोड और विश्लेषण करना है। कुछ विश्लेषण में आउटपुट/सेक, ग्राफिंग (स्ट्रीम प्लॉट के समान), और कुछ अन्य संख्यात्मक गणना शामिल होगी।

सबसे बड़ी समस्या यह है कि मैं केवल csv फ़ाइल के लिए उपयोग किया है, और मैं डेटा का विश्लेषण करने में सक्षम होने के रूप में यह हानि या देरी के बिना आता है की जरूरत है।

+0

अनिवार्य रूप से लक्ष्य क्या है? क्या फ़ाइल में बदलावों की जांच करने के लिए वॉचडॉग की तरह कुछ बेहतर दृष्टिकोण हो सकता है? –

+1

आप लॉक को भी कार्यान्वित कर सकते हैं, इसलिए केवल एक ही प्रक्रिया फ़ाइल को एक समय में खोल सकती है, यूनिक्स के पास इसे करने के कई तरीके हैं http://stackoverflow.com/questions/29520587/checking-running-python-script-within-the- अजगर स्क्रिप्ट/29522672 # 29522672। एक प्रक्रिया पढ़ने और अन्य लेखन शायद आपको कोई डेटा नहीं खोएगा, लेकिन यदि आप परिवर्तनों के परीक्षण के लिए डेटा का उपयोग कर रहे हैं तो आपको गलत आउटपुट मिलेगा –

+0

वॉचडॉग उपयोग करने के लिए एक दिलचस्प टूल की तरह प्रतीत होता है, लेकिन जो मैं ढूंढ रहा हूं वह नहीं। मैंने और अधिक व्याख्या करने के लिए अपना प्रश्न संपादित किया। – Leb

उत्तर

2

लिपियों में से एक है, जबकि अन्य फाइल करने के लिए लिखने की कोशिश कर रहा है फ़ाइल पढ़ रहा है। दोनों स्क्रिप्ट एक ही समय में फ़ाइल तक नहीं पहुंच सकते हैं। पद्रिक कनिंघम की तरह टिप्पणियों में कहा गया है कि आप इस समस्या को हल करने के लिए लॉक फ़ाइल को कार्यान्वित कर सकते हैं।

एक पायथन पैकेज है जो lockfile को प्रलेखन here के साथ ही करेगा।

यहाँ lockfile पैकेज लागू किया के साथ अपना पहला स्क्रिप्ट है:

import pandas as pd 
from time import sleep 
import random 
from lockfile import FileLock 

df2 = pd.DataFrame(data = [['test','trial']], index=None) 
lock = FileLock('data.lock') 

while True: 
    with lock: 
     df = pd.read_csv('data.csv', header=None) 
     df.append(df2) 
     df.to_csv('data.csv', index=False) 
    sleep(random.uniform(0.025,0.3)) 

यहाँ आप lockfile पैकेज लागू किया साथ दूसरे पटकथा है:

import pandas as pd 
from time import sleep 
from lockfile import FileLock 

lock = FileLock('data.lock') 

while True: 
    with lock: 
     df = pd.read_csv('data.csv', header=None, names=['Name','DATE']) 
    print(df.shape) 
    sleep(0.100) 

मुझे लगता है कि मैं कर सकता तो 100ms के इंतजार जोड़ा कंसोल को आउटपुट धीमा करें।

ये स्क्रिप्ट "data.csv" फ़ाइल तक पहुंचने से पहले "data.lock" नामक फ़ाइल बनायेगी और "data.csv" फ़ाइल तक पहुंचने के बाद फ़ाइल "data.lock" को हटा देंगी। किसी भी स्क्रिप्ट में, यदि "data.lock" मौजूद है, तो स्क्रिप्ट तब तक प्रतीक्षा करेगी जब तक "data.lock" फ़ाइल मौजूद न हो।

+0

यह काम नहीं करेगा क्योंकि पहली स्क्रिप्ट फ़ाइल का सिमुलेशन है जिसे लगातार अपडेट किया जा रहा है। हकीकत में मैं केवल दूसरी स्क्रिप्ट को बदल/संपादित कर सकता हूं जहां मैं केवल फाइल पढ़ रहा हूं – Leb

1

आपका अनुकरण स्क्रिप्ट पढ़ता है और data.csv फाइल करने के लिए लिखता है।यदि आप एक स्क्रिप्ट फ़ाइल को केवल लिखने के रूप में खोलते हैं और दूसरा फ़ाइल केवल पढ़ने के रूप में खुलता है तो आप समवर्ती रूप से पढ़ और लिख सकते हैं।

इसे ध्यान में रखते

, मैं निम्नलिखित करने के लिए फ़ाइल लिखने के लिए अपने सिमुलेशन स्क्रिप्ट बदल दिया है: अजगर में

from time import sleep 
import random 

while(True): 
    with open("data.csv", 'a') as fp: 
     fp.write(','.join(['0','1'])) 
     fp.write('\n') 
    sleep(0.010) 

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

अब आप जिस मुद्दे का उल्लेख करते हैं, उसके बिना आपको अपनी दूसरी स्क्रिप्ट का उपयोग करके पढ़ने में सक्षम होना चाहिए।

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