在MongoDB下使用JS和Python的效能比較
在普通硬體上,MongoDB能夠實現每秒插入80000記錄。
時間事件樣本資料如下:
{ "_id" : ObjectId("5298a5a03b3f4220588fe57c"), "created_on" : ISODate("2012-04-22T01:09:53Z"), "value" : 0.1647851116706831 } <p class="indent"> |
當我們想要得到的隨機值,我們認為使用JavaScript或Python生成它們的(我們可以在Java中嘗試過,但我們想盡可能快地把它寫)。我們不知道哪一個會比較快,所以我們決定對它們進行測試。我們的第一次嘗試是透過在MongoDB shell中執行JavaScript:
var minDate = new Date(2012, 0, 1, 0, 0, 0, 0); var maxDate = new Date(2013, 0, 1, 0, 0, 0, 0); var delta = maxDate.getTime() - minDate.getTime(); var job_id = arg2; var documentNumber = arg1; var batchNumber = 5 * 1000; var job_name = 'Job#' + job_id var start = new Date(); var batchDocuments = new Array(); var index = 0; while(index < documentNumber) { var date = new Date(minDate.getTime() + Math.random() * delta); var value = Math.random(); var document = { created_on : date, value : value }; batchDocuments[index % batchNumber] = document; if((index + 1) % batchNumber == 0) { db.randomData.insert(batchDocuments); } index++; if(index % 100000 == 0) { print(job_name + ' inserted ' + index + ' documents.'); } } print(job_name + ' inserted ' + documentNumber + ' in ' + (new Date() - start)/1000.0 + 's'); <p class="indent"> |
執行後結果是:
mongo random --eval "var arg1=50000000;arg2=1" create_random.js
Job#1 inserted 100000 documents.
Job#1 inserted 200000 documents.
Job#1 inserted 300000 documents.
...
Job#1 inserted 49900000 documents.
Job#1 inserted 50000000 in 566.294s
時間花費566.294s,平均88293 inserts/second。
而使用Python腳步後的輸出時間:
python create_random.py 50000000
Job#1 inserted 100000 documents.
Job#1 inserted 200000 documents.
Job#1 inserted 300000 documents.
...
Job#1 inserted 49900000 documents.
Job#1 inserted 50000000 in 1713.501 s
時間花費1713.501s, 平均比javascript慢29180 inserts/second。但是不用洩氣,我們可以讓Python 利用四核的潛力,每個CPU執行一個。
import sys import pymongo import time import subprocess import multiprocessing from datetime import datetime cpu_count = multiprocessing.cpu_count() # obtain a mongo connection connection = pymongo.Connection('mongodb://localhost', safe=True) # obtain a handle to the random database db = connection.random collection = db.randomData total_documents_count = 50 * 1000 * 1000; inserted_documents_count = 0 sleep_seconds = 1 sleep_count = 0 for i in range(cpu_count): documents_number = str(total_documents_count/cpu_count) print documents_number subprocess.Popen(['python', '../create_random.py', documents_number, str(i)]) start = datetime.now(); while (inserted_documents_count < total_documents_count) is True: inserted_documents_count = collection.count() if (sleep_count > 0 and sleep_count % 60 == 0): print 'Inserted ', inserted_documents_count, ' documents.' if (inserted_documents_count < total_documents_count): sleep_count += 1 time.sleep(sleep_seconds) print 'Inserting ', total_documents_count, ' took ', (datetime.now() - start).total_seconds(), 's' <p class="indent"> |
這次執行結果是:
python create_random_parallel.py
Job#3 inserted 100000 documents.
Job#2 inserted 100000 documents.
Job#0 inserted 100000 documents.
Job#1 inserted 100000 documents.
Job#3 inserted 200000 documents.
...
Job#2 inserted 12500000 in 571.819 s
Job#0 inserted 12400000 documents.
Job#3 inserted 10800000 documents.
Job#1 inserted 12400000 documents.
Job#0 inserted 12500000 documents.
Job#0 inserted 12500000 in 577.061 s
Job#3 inserted 10900000 documents.
Job#1 inserted 12500000 documents.
Job#1 inserted 12500000 in 578.427 s
Job#3 inserted 11000000 documents.
...
Job#3 inserted 12500000 in 623.999 s
Inserting 50000000 took 624.655 s
平均80044 inserts/seconds,成績符合我們的預期。但是比JS還慢一些,下面我們使用子程式再最佳化:
for i in range(cpu_count): documents_number = str(total_documents_count/cpu_count) script_name = 'create_random_' + str(i + 1) + '.bat' script_file = open(script_name, 'w') script_file.write('mongo random --eval "var arg1=' + documents_number +';arg2=' + str(i + 1) +'" ../create_random.js'); script_file.close() subprocess.Popen(script_name) <p class="indent"> |
最後得到83437 inserts/second成績,但是還是沒有擊敗Javascript的88293 inserts/second成績。
測試網站程式碼:Github
相關文章
- Python、JavaScript和Rust的Web效能比較 - AlexPythonJavaScriptRustWeb
- 請比較下for、forEach、for of的效能的效能
- js 深比較和淺比較JS
- mongodb和hbase的簡單比較MongoDB
- 大偏移量下Redis與MongoDB的分頁/排名效能比較RHRedisMongoDB
- python 批量resize效能比較Python
- 比較Java與Node.js的併發性和效能- maxantJavaNode.js
- Go和Python比較的話,哪個比較好?GoPython
- 效能比較
- 使用 BenchmarkDotNet 比較指定容量的 List 的效能
- MySQL 中的 distinct 和 group by 的效能比較MySql
- 堆排序和快速排序效能比較排序
- Redis vs. MongoDB比較RedisMongoDB
- EXCEL,POI,EASYEXCEL的使用和比較Excel
- JS中使用new Array()與使用Array.from()方式建立二維陣列的效能比較JS陣列
- Stream.toList()和Collectors.toList()的效能比較
- React.js和Vue.js的語法並列比較ReactVue.js
- [譯] 原生 iOS(Swift) 和 React-Native 的效能比較iOSSwiftReact
- Java Python 和Nodejs在web開發方面的簡單比較JavaPythonNodeJSWeb
- js比較日期 - JavaScriptJSJavaScript
- mongodb macos 下的安裝和使用MongoDBMac
- Java Bean Copy元件的效能比較JavaBean元件
- mongodb資料庫使用03、python和mongodb的互動MongoDB資料庫Python
- [pythonskill]Python中NaN和None的詳細比較PythonNaNNone
- SAP UI5和React的頁面渲染效能比較UIReact
- SAP ABAP ADBC和Java JDBC的使用比較JavaJDBC
- 服務網格Istio、Linkerd和Cilium效能比較
- js物件陣列Date的比較JS物件陣列
- js物件如何深比較?JS物件
- JS變數比較陷阱JS變數
- Rust在瀏覽器Wasm和後端伺服器中執行效能比較Rust瀏覽器ASM後端伺服器
- Python的List vs Tuple比較Python
- python比較json/dictionary的庫PythonJSON
- PostgreSQL、Redis與Memcached的效能比較 - CYBERTECSQLRedis
- 雲主機的硬碟IO效能比較硬碟
- Python NLP庫 Top6的介紹和比較Python
- Python NLP庫top6的介紹和比較Python
- 大資料入門課程:Hadoop和spark的效能比較大資料HadoopSpark
- Web前端和Python學哪個比較好?Python教程!Web前端Python