Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用gridfs将大型json文件直接导入到mongodb,并准备好模式_Python_Json_Mongodb_Pymongo_Gridfs - Fatal编程技术网

Python 如何使用gridfs将大型json文件直接导入到mongodb,并准备好模式

Python 如何使用gridfs将大型json文件直接导入到mongodb,并准备好模式,python,json,mongodb,pymongo,gridfs,Python,Json,Mongodb,Pymongo,Gridfs,通常,我们可以使用shell中的命令mongoimport将JSON文件和Large文件上传到mongodb,这样我们就可以在集合中准备好我们的模式,而无需担心最大大小(16MB),因为mongo将负责批量大小等(这已经过测试和工作),数据将是成行的,一切都很好 这里的主要问题是如何使用pymongo和GridFS对python做同样的事情。当我使用GridFS时,它正在上载到不同类型的集合(*.files),模式的定义与第一个方法不同。文件以字节为单位,集合名称为*.Files 我想知道如何使

通常,我们可以使用shell中的命令mongoimport将JSON文件和Large文件上传到mongodb,这样我们就可以在集合中准备好我们的模式,而无需担心最大大小(16MB),因为mongo将负责批量大小等(这已经过测试和工作),数据将是成行的,一切都很好

这里的主要问题是如何使用pymongo和GridFS对python做同样的事情。当我使用GridFS时,它正在上载到不同类型的集合(*.files),模式的定义与第一个方法不同。文件以字节为单位,集合名称为*.Files

我想知道如何使用python方法和使用mongoimport命令获得结果

我的代码是:

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

我的目标是在普通集合中立即准备好模式,而不是在GridFS集合中:

我在pymongo中尝试过大容量插入,但由于文件太大,因此无法正常工作, 我相信我们会找到一种方法,不需要使用GridFS,但让我们将其保留在python中


谢谢大家!

好的,我创建了一个函数,用于拆分数据帧并暂时保存,以便以后插入

它的工作原理是将每个数据帧的各个部分扩展到小于16MB的10%,然后我们接受它

附言:这是给GeoJSON的

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)

db.append(file.read\u contents('path/to/file'),is\u large\u file=True,use\u multi\u cores=True)
?我没有找到db的append函数,其他函数也不存在