आम तौर पर हम JSON फ़ाइलों को अपलोड करने के लिए शेल से mongoimport कमांड का उपयोग कर सकते हैं और बड़े वाले को भी mongodb पर अपलोड कर सकते हैं और हमें चिंता करने की आवश्यकता के बिना संग्रह में हमारी स्कीमा तैयार होगी मोंगो के रूप में अधिकतम आकार (16 एमबी) बैच आकार आदि का ख्याल रखेगा (यह परीक्षण और काम किया गया है), और डेटा पंक्तियों में होगा और सब कुछ बढ़िया है।

यहां मुख्य समस्या यह है कि पाइमोंगो और ग्रिडएफएस का उपयोग करके पाइथन के साथ एक ही काम कैसे करें। जब मैं ग्रिडएफएस का उपयोग कर रहा हूं, तो यह एक अलग प्रकार के संग्रह (*.फाइल) पर अपलोड हो रहा है और स्कीमा को पहली विधि की तरह परिभाषित नहीं किया गया है। फ़ाइलें बाइट्स में हैं और संग्रह नाम हैं *.files

मैं जानना चाहता हूं कि पायथन विधि कैसे करें और mongoimport कमांड का उपयोग करके परिणाम प्राप्त करें

मेरा कोड है:

fs = gridfs.GridFS(db, collection='test_collection')
with open(path_to_big_json_file, 'rb') as dictionary:
    fs.put(dictionary, filename='test_filename')

और परिणाम नीचे दिए गए हैं:

enter image description here

मेरा लक्ष्य एक सामान्य संग्रह में तुरंत स्कीमा तैयार करना है, न कि इस तरह के GridFS संग्रह में: यहां छवि विवरण दर्ज करें

मैंने पाइमोंगो में बल्क इंसर्ट की कोशिश की है और यह काम नहीं किया है क्योंकि फाइल इतनी बड़ी थी, मुझे यकीन है कि हम एक रास्ता तय करेंगे, ग्रिडएफएस का उपयोग करना आवश्यक नहीं है, लेकिन इसे अजगर में रखें

शुक्रिया!

0
Arrajj 26 नवम्बर 2019, 19:57

1 उत्तर

सबसे बढ़िया उत्तर

ठीक है, मैंने एक फ़ंक्शन बनाया है जो डेटाफ़्रेम को विभाजित करता है और बाद में इसे सम्मिलित करने के लिए अस्थायी रूप से सहेजता है

यह प्रत्येक डेटाफ़्रेम को 16 एमबी से कम भागों में 10 प्रतिशत तक बढ़ाने पर काम करता है, फिर हम उसे निगल लेते हैं

पीएस: यह जियोसन के लिए है

def insert_geojson_in_batches_to_mongo(mongoclient, db, collection_name, origin_path, threshold=10):

  df = gpd.read_file(transformed_path)
  file_size = os.path.getsize(origin_path)
  max_size = mongoclient.max_bson_size
  number_of_dataframes = ceil(file_size*(1+threshold/100) / max_size)
  df_len = len(df)
  number_of_rows_per_df = floor(df_len/number_of_dataframes)
  collection = db.get_collection(collection_name)

  with tempfile.TemporaryDirectory() as tmpdirname:
    count = 0
    k = 0
    while True:
      if count > df_len-1:
            break          
      filename = tmpdirname + 'df' + str(count) + '.geojson'
      start = count
      count += number_of_rows_per_df  
      k += 1
      df.iloc[start : count].to_file(filename, driver="GeoJSON")      
      with open(filename) as f: 
        data = json.load(f)  
      data = data['features']
      print('bulk {0}/{1} is being loaded'.format(k , number_of_dataframes+1))
      collection.insert_many(data)
0
Khaled arja 27 नवम्बर 2019, 18:33