首先,让我在这里解释项目问题:
我正在开发一个Web应用程序,使用库 CherryPy , PyMongo ,数据库后端是一个 MongoDB数据库,我我正在使用 Python 3 作为开发语言。
我的数据库集合包含260.640个文档,这些文档的格式简化为:
{"_id":1,"time":"2014-01-01 00:00:00","value":"1.37468"}
集合中的所有文档都有一个id(从0到260640),每个时间增加一分钟(所以我总共有6个月的数据)。
我在Windows控制台中运行Mongod.exe服务器,在另一个Windows控制台中运行我的python Web服务器,并使用谷歌浏览器查看网页。
我的目标:
我想查询数据库集合,因此我可以获得一个包含两个日期之间行的HTML表格,例如:2014-01-01 00:00:00和2014-01-10 00:00:00,以及然后应该在CherryPy正在制作的网页上查看该表。
我的问题:
使用问题中提供的代码,我可以查询数据库并在网页上显示表格,但是,显示大约7200行大约需要30-50秒,这只是大约5天的数据当我需要显示10天的数据甚至一个月的数据时,我们会谈论更长的等待时间,问题首先是用户必须等待,而且如果用户选择更长的时间跨度,浏览器可能会超时,这会杀死申请。
我的慢代码:
以下是目前有效的代码,但仅作为"标准车",我需要一辆超级跑车"。
def onem(self):
# Get the MongoClient from the PyMongo lib.
client = MongoClient()
# our database name is raw_data
db = client.raw_data
# Get the starting date from the database (returns a valid date string).
date_from = self.getFromDateToDatePickerFromDB();
# Get the end date from the database (returns a valid date string).
date_to = self.getToDateToDatePicker();
# Query the database for the collection of documents.
collection = db.data.find({'time' : {'$gte' : date_from, '$lt' : date_to}})
# Define a variable to hold the temp rows.
html = ""
# for each document in our collection.
for document in collection:
# build the table.
html = html + '''
<tr>
<td>''' + str(int(document['_id'])) + '''</td>
<td>''' + str(document['time']) + '''</td>
<td>''' + str(document['value']) + '''</td>
</tr>
'''
table = '''
<table border="1" celspacing="0" cellpadding="0" width="100%">
<thead>
<tr>
<td>ID</td>
<td>TIME</td>
<td>VALUE</td>
</tr>
</thead>
<tbody>
''' + html + '''
</tbody>
</table>
'''
# return the valid html with the table to a function which
# outputs an html template to the browser.
return self.GetStaticHTML(table)
# Tell CherryPy that we are done working on the webpage and it lets us show it to the browser.
onem.exposed = True
如果你们中任何人知道查询mongodb数据库的方法比提供的代码更好:
collection = db.data.find({'time' : {'$gte' : date_from, '$lt' : date_to}})
或者,如果您知道加快数据库,代码或其他任何方式的方法,那么我真的很想听。
谢谢,
答案 0 :(得分:0)
可能存在两个弱点,使您的代码变慢且无法扩展: