У меня есть база данных около 12 000 записей. Каждая запись дала широту, долготу и пустое расстояние. Мне нужно найти 25 ближайших записей из текущего местоположения GPS. Мой ORM - greenDao.Поиск 25 ближайших мест от db в android является SLOW
Есть 2 проблемы: Я не знаю расстояние между мной и записями, и я не могу загрузить все записи в ОЗУ, потому что, когда я это делаю, куча доходит до 70 МБ, а приложение вылетает из OutOfMemoryException (так что мне нужно используйте ленивую загрузку).
Я попробовал этот подход:
- Получить итератор для данной таблицы
- входа нагрузки, вычислить его расстояние от моей текущей позиции, сохранить запись в ArrayList буфер (флеш-буфер ввода каждые 1000 записей обратно в БД (это просто updateInTx (...)), а затем очистить его)
- повторить точку 2 до iterator.hasNext();
- запрос из записей с пределом (25) .orderAsc()
- результат
Это работает, но с точки 1-3 это очень и очень медленно (занимает около 25 секунд на Nexus 7). Отдых занимает около 1,5 секунд.
Я должен делать это каждый раз, когда пользователь запускает обновление приложений или запросов. Любые идеи, как решить проблему лучше?
Благодаря
EDIT: Это функция для вычисления расстояния, так что его трудно сделать это в SQL :(
double getDistance(GPSCoords myPos, Place place) {
double dlong = (place.getLongitude() - myPos.getLongitude()) * d2r;
double dlat = (place.getLatitude() - myPos.getLatitude()) * d2r;
double a = Math.pow(Math.sin(dlat/2.0), 2) + Math.cos(myPos.getLatitude() * d2r)
* Math.cos(place.getLatitude() * d2r) * Math.pow(Math.sin(dlong/2.0), 2);
double c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
double d = 6367 * c;
return d;
}
Попробуйте использовать SQL ???? Рассчитайте его в SQL. Dont цикл через итератор – Doomsknight
Функция расчета расстояния довольно сложна (пожалуйста, проверьте мое редактирование). Я предполагаю, что можно создать какую-то процедуру plsql или что-то в этом роде, но разве она сражается с зеленым дао? – bakua
Если OR/M не подходит, не носите его. – BlackICE