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