Разбор эффективности большого текстового файла - PullRequest
1 голос
/ 08 октября 2011

Из-за простоты у меня есть текстовый файл с записями, разделенными;и разбирает каждую строку в объект.Проблема в том, что текстовый файл содержит почти 10 000 строк.

Мне также нужно создать ключи для каждого объекта, который я анализирую, чтобы я мог фильтровать результаты в интерфейсе поиска.

Это занимает почти16 секунд в эмуляторе, чтобы разобрать текст и добавить ключи.Я делаю что-то не так здесь?Или есть более эффективный способ?

Вот мой синглтон базы данных:

    public class Database {

        private static Database instance = null;    private final Map<String, List<Stop>> mDict = new ConcurrentHashMap<String, List<Stop>>();

        public static Database getInstance() {      if (instance == null) {             instance = new Database();      }       return instance;    }       public List<Stop> getMatches(String query) {
            List<Stop> list = mDict.get(query);
            return list == null ? Collections.EMPTY_LIST : list;
        }
             private boolean mLoaded = false;

            /**
             * Loads the words and definitions if they haven't been loaded already.
             *
             * @param resources Used to load the file containing the words and definitions.
             */
            public synchronized void ensureLoaded(final Resources resources) {
                if (mLoaded) return;

                new Thread(new Runnable() {
                    public void run() {
                        try {
                            loadStops(resources);
                        } catch (IOException e) { 
                            throw new RuntimeException(e);
                        }
                    }
                }).start();
            }

            private synchronized void loadStops(Resources resources) throws IOException
            {
                if (mLoaded) return;

                Log.d("database", "loading stops");

                InputStream inputStream = resources.openRawResource(R.raw.allstops);
                BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));

                try {
                    String line;
                    while((line = reader.readLine()) != null) {
                        String[] strings = TextUtils.split(line, ";");
                        addStop(strings[0], strings[1], strings[2]);
                    }
                } finally {
                    reader.close();
                }

                Log.d("database", "loading stops completed");

                mLoaded = true;
            }

            private void addStop(String name, String district, String id) {
                Stop stop = new Stop(id, name, district);

                int len = name.length();
                for (int i = 0; i < len; i++) {
                    String prefix = name.substring(0, len - i).toLowerCase();
                    addMatch(prefix, stop);
                }
            }

            private void addMatch(String query, Stop stop) {
                List<Stop> matches = mDict.get(query);
                if (matches == null) {
                    matches = new ArrayList<Stop>();
                    mDict.put(query, matches);
                }
                matches.add(stop);
            }

    }

Вот некоторые примеры данных:

Mosseporten Senter;Norge;9021014089003000;59.445422;10.701055;273
Oslo Bussterminal;Norge;9021014089004000;59.911369;10.759665;273
Långegärde;Strömstad;9021014026420000;58.891462;11.007767;68
Västra bryggan;Strömstad;9021014026421000;58.893080;11.009997;7
Vettnet;Strömstad;9021014026422000;58.903184;11.020739;7
Ekenäs;Strömstad;9021014026410000;58.893610;11.048821;7
Kilesand;Strömstad;9021014026411000;58.878472;11.052983;7
Ramsö;Strömstad;9021014026430000;58.831531;11.067402;7
Sarpsborg;Norge;9021014089002000;59.280937;11.111763;273
Styrsö;Strömstad;9021014026180000;58.908110;11.115818;7
Capri/Källviken;Strömstad;9021014026440000;58.965200;11.124384;63
Lindholmens vändplan;Strömstad;9021014026156000;58.890212;11.128393;64
Öddö;Strömstad;9021014026190000;58.923490;11.130767;7
Källviksdalen;Strömstad;9021014026439000;58.962414;11.131962;64
Husevägen;Strömstad;9021014026505000;58.960094;11.133535;274
Caprivägen;Strömstad;9021014026284000;58.958404;11.134281;64
Stensviks korsväg;Strömstad;9021014026341000;59.001499;11.137203;63
Kungbäck;Strömstad;9021014026340000;59.006056;11.140313;63
Kase;Strömstad;9021014026173000;58.957649;11.141904;274

Ответы [ 2 ]

2 голосов
/ 08 октября 2011

Вы должны добавить информацию в базу данных SQLite и отправить приложение с базой данных в res / raw.

Кроме того, файл db часто можно эффективно сжать в zip-файл.

См. Дополнительную информацию: Отправьте приложение с базой данных

0 голосов
/ 17 декабря 2011

Самый быстрый способ загрузить эти данные в память - поместить их прямо в файл .java.Например, stopNames={"Stop1", "Stop2", ...}; latitudes={...};

Я делаю это в своем приложении для общественного транспорта, загрузка аналогичных объемов данных занимает менее секунды, фильтрация выполняется мгновенно.

...