У меня есть куча списков слов на моем сервере, и я планировал создать простой API JSON с открытым исходным кодом, который возвращает, если пароль находится в списке , как метод проверки. Я делаю это в Python с Flask и буквально просто возвращаюсь, если присутствует вход.Скорость поиска: состояние или база данных?
Одна небольшая проблема: список слов составляет около 150 миллионов записей и 1,1 ГБ текста.
Мой API (минимальный) находится ниже. Является ли более эффективным хранить каждую строку в MongoDB и многократно искать или хранить всю вещь в памяти с помощью синглета, и заполнять ее при запуске, когда я вызываю app.run
? Или различия являются субъективными?
Кроме того, это даже хорошая практика, чтобы сделать последнее? Я думаю, что поиски могут начать обходить налогом, если я открою это для публики. Я также предложил кому-то предложить Trie для эффективного поиска.
Обновление: Я проделал немного тестирования, и поиск документов очень медленный с таким большим количеством записей. Можно ли использовать базу данных с надлежащими индексами для одного столбца данных, который необходимо эффективно искать?
from flask import Flask
from flask.views import MethodView
from flask.ext.pymongo import PyMongo
import json
app = Flask(__name__)
mongo = PyMongo(app)
class HashCheck(MethodView):
def post(self):
return json.dumps({'result' :
not mongo.db.passwords.find({'pass' : request.form["password"])})
# Error-handling + test cases to come. Negate is for bool.
def get(self):
return redirect('/')
if __name__ == "__main__":
app.add_url_rule('/api/', view_func=HashCheck.as_view('api'))
app.run(host="0.0.0.0", debug=True)
1: Я - гайка безопасности. Я использую его в своих регистрационных формах и отклоняю общий ввод. Одним из списков слов является UNIQPASS.
Поскольку список является статическим, его можно сохранить в памяти. Но если вы собираетесь использовать MongoDB, обязательно сделайте закрытый запрос: http://docs.mongodb.org/manual/reference/method/cursor.explain/#explain.indexOnly – Madarco