2017-11-14 2 views
0

내 mongodb에 pymongo를 쓰고 있습니다. 가능한 빠른 성능을 원합니다. 그래서 쓰기 문제를 w = 0으로 설정했습니다. 위의 모든 시도에서pymongo 단일 삽입은 WriteConcern (w = 0)에도 불구하고 너무 느립니다.

1.

client = MongoClient(host=HOST, port=PORT, w=0) 
collection = client[DB][COLLECTION] 
collection.insert_one(data) 

2.

client = MongoClient(host=HOST, port=PORT) 
collection = collection.with_options(write_concern=WriteConcern(w=0)) 
collection = client[DB][COLLECTION] 
collection.insert_one(data) 

3.

client = MongoClient(host=HOST, port=PORT) 
collection = client[DB][COLLECTION] 
collection.insert_one(data, bypass_document_validation=True) 

, 그것은 collection.insert_one 걸린 시간 (: 나는 세 가지 방법을 시도) ~ 0.5 초 (!)

W 아직도 오래 걸리는 삽입입니까?

나는 적어도 그 시간의 약 5 분의 일이어야한다고 생각한다. 따라서 '데이터'는 많은 데이터가 아니라 단지 몇 가지 항목입니다. mongodb 3.4 및 pymongo 3.0을 사용 중입니다.

답변

1

먼저 "얼마나 빠름이 빠름"으로 대답해야합니다.

"느림"및 "빠름"은 매우 주관적인 용어입니다. 이는 프로비저닝 된 서버, 사용하는 언어, 삽입하는 문서, 컬렉션에 정의한 인덱스의 수, 기대까지의 많은 요소에 달려 있습니다.

일부 사람들에게는 "느린"것이> 100ms입니다. 다른 사람들의 경우 "느림"은> 10ms입니다. 물론, "빠른"결과를 얻으려면 서버 프로비저닝 비용이 더 비쌉니다.

또 다른 주목할 점은 파이썬이 가장 빠른 언어는 아닙니다. Global Interpreter Lock의 사용과 관련된 제한 사항은 잘 알려져 있습니다. 또한 해석 언어이기도하며 기본적으로 가독성을 높이기 위해 설계되었으며 속도는 아닙니다. 컴파일 된 언어 (C, C++ 등)를 사용하여 즉각적인 속도 향상을 얻을 수 있습니다.

또 다른 시도는 대량 삽입을 사용하고 insert_one()을 사용하여 많은 문서를 삽입하지 않는 것입니다. 대량 삽입을 사용하는 예는 http://api.mongodb.com/python/current/examples/bulk.html#bulk-insert을 참조하십시오.

+0

감사합니다. 가장 걱정스러운 점은 insert_one()에 걸린 시간이 쓰기 관심사를 추가하기 전과 후에 매우 비슷하다는 점입니다. 올바른 영향을 미치지 않았을 수 있습니까? 벌크 삽입에 관해서는, db마다 응용 프로그램 실행마다 소량을 쓰고 싶기 때문에 문제가됩니다. –

+0

@KerenMeron이 경우 응용 프로그램에서 데이터베이스에 액세스하는 왕복 시간은 복제 세트 노드 간의 지연 또는 저널에 쓰는 데 걸리는 시간보다 훨씬 큽니다. MongoDB는 분산 데이터베이스이므로 시간에 민감한 응용 프로그램의 경우 네트워크 상황을 고려해야합니다. WriteConcern을 사용하면 작업 속도가 빨라질 수 있지만 네트워크보다 빠를 수는 없습니다. –