2017-01-13 5 views
5

यह बड़ी JSON फ़ाइलों को पढ़ने के बारे में नहीं है, इसके बजाय यह सबसे प्रभावी तरीके से JSON फ़ाइलों की बड़ी संख्या पढ़ने के बारे में है।पायथन में बड़ी संख्या में जेसन फाइलें पढ़ रहे हैं?

प्रश्न

मैं Million song dataset से last.fm डाटासेट के साथ काम कर रहा हूँ। डेटा जेएसओएन-एन्कोडेड टेक्स्ट फ़ाइलों के सेट के रूप में उपलब्ध है जहां कुंजी हैं: track_id, कलाकार, शीर्षक, टाइमस्टैम्प, सिमिलर और टैग।

वर्तमान में मैं उन्हें निम्नलिखित तरीके से पांडा में पढ़ रहा हूँ कुछ ही विकल्प के माध्यम से जा के रूप में इस से पता चला here के रूप में सबसे तेज है के बाद:

import os 
import pandas as pd 
try: 
    import ujson as json 
except ImportError: 
    try: 
     import simplejson as json 
    except ImportError: 
     import json 


# Path to the dataset 
path = "../lastfm_train/" 

# Getting list of all json files in dataset 
all_files = [os.path.join(root,file) for root, dirs, files in os.walk(path) for file in files if file.endswith('.json')] 

data_list=[json.load(open(file)) for file in all_files] 
df = pd.DataFrame(data_list, columns=['similars', 'track_id']) 
df.set_index('track_id', inplace=True) 

वर्तमान पद्धति सबसेट (पूर्ण डाटासेट का 1% पढ़ता एक सेकंड से भी कम समय में)। हालांकि, पूरा ट्रेन सेट पढ़ना बहुत धीमा है और हमेशा पढ़ने के लिए (मैंने कुछ घंटों तक इंतजार किया है) पढ़ने के लिए और question here में दिखाए गए कार्यों के लिए एक बाधा बन गई है।

मैं भी json फ़ाइलें जो जनरेटर समझ के बजाय सूची समझ का उपयोग करने से this question here

UPDATE 1 जाहिर देखा जा सकता है पार्स करने में गति प्रयोजनों के लिए ujson उपयोग कर रहा हूँ।

data_list=(json.load(open(file)) for file in all_files) 
+2

ऐसा लगता है कि आपके पास पर्याप्त रैम नहीं है, और यह SWAP का उपयोग करना शुरू कर देता है, सबसे आसान समाधान अधिक रैम प्राप्त करना होगा। –

+0

@ फ्रांसिस्कोकोज़ शायद सबसे आसान .. लेकिन निश्चित रूप से सबसे सस्ता नहीं! : डी – dizzyf

+0

मेरे पास पहले से ही 16 गीगा हैं और मुझे लगता है कि इस तरह एक सामान्य डेटासेट पढ़ने के लिए निश्चित रूप से पर्याप्त है। क्या इतनी सारी जेसन फाइलें पढ़ने का बेहतर तरीका है? – TJain

उत्तर

0

मैं फ़ाइलों पर पुनरावर्तक और बस yield दो कॉलम आप चाहते हैं का निर्माण होगा।

फिर आप उस इटरेटर के साथ DataFrame को तुरंत चालू कर सकते हैं।

import os 
import json 
import pandas as pd 

# Path to the dataset 
path = "../lastfm_train/" 

def data_iterator(path): 
    for root, dirs, files in os.walk(path): 
     for f in files: 
      if f.endswith('.json'): 
       fp = os.path.join(root,f) 
       with open(fp) as o: 
        data = json.load(o) 
       yield {"similars" : data["similars"], "track_id": data["track_id"]} 


df = pd.DataFrame(data_iterator(path)) 
df.set_index('track_id', inplace=True) 

इस तरह आप केवल एक बार अपनी फ़ाइलें सूची पर जाने के लिए और आप से पहले और यह DataFrame

+0

कृपया जनरेटर समझ का उपयोग कर अद्यतन देखें। – TJain

+1

मैंने पोस्ट किए गए कोड का उपयोग (देशी पैकेज 'जेसन' के साथ), मैंने '104 सेकंड्स – arthur

+0

में पूर्ण ट्रेन सेट डेटासेट लोड किया है, साथ ही आपका कोड 1.04 सेकेंड में सबसेट (1%) लोड करता है और इसलिए, अपेक्षित 100 के आसपास कुछ लोड करने के लिए पूर्ण। हालांकि, मेरी मशीन पर आपका कोड 406 लेता है और मेरा कोड 473 लेता है। मैं 16 जीबी रैम के साथ मैकबुक प्रो 2015 संस्करण का उपयोग कर रहा हूं। आप किस जानवर का उपयोग कर रहे हैं जो पूर्ण डेटासेट को पूरी तरह से स्केल कर रहा है? – TJain

2

को पास करने के बाद डेटा नकल नहीं होगा आप डाटासेट पर कई आईओ कार्रवाई करना आवश्यक है, यही कारण है कि न सिर्फ .json फ़ाइलों को एक तेज़ आईओ प्रारूप में कनवर्ट करें? यदि आपके डेटासेट का कुल आकार 2.5 जी है जिसे पढ़ने के लिए एक मिनट से अधिक समय नहीं लेना चाहिए, तो मानक मैकबुक पर भी .csv फ़ाइल के रूप में संग्रहीत किया जाना चाहिए।

उदाहरण के लिए, पांडा 0.20 में नया .feather प्रारूप है। पांडा लेखक से विवरण के लिए here देखें। मानक देव मैकबुक पर अपने स्वयं के परीक्षण में, मैंने लगभग 1 सेकंड में 1 जीबी फाइलें पढ़ी हैं।

एक अन्य ध्यान दें: के रूप में पांडा संस्करण अभी तक स्तंभों के एक सबसेट को पढ़ने के लिए अनुमति नहीं है मैं, शीर्ष स्तर के pandas.read_feather समारोह की feather.read_data का उपयोग कर की सिफारिश करेंगे। आप पंख here डाउनलोड कर सकते हैं या बस pip install feather का उपयोग कर सकते हैं।

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