Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> быстрый поиск 
:(
    Опции темы
TupleCa
Дата 9.12.2006, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 7.11.2006

Репутация: нет
Всего: нет



в файле d.dat содержится 181440 полей. (в дальнейшем надо около 1 триллиона)
вот код, как я ищу нужную строку по заданному ключу m
Код

        Properties ht = new Properties();        
        FileInputStream fin = null;
        try{
            fin=new FileInputStream("dict\\d.dat");
        }
        catch(FileNotFoundException e){
            
        }
        try{
            if(fin!=null){
                ht.load(fin);
                fin.close();
            }
        }
        catch(IOException e){
            System.out.println("Error read file");
        }
        String put=(String)ht.get(m);
        StringBuffer str=new StringBuffer(put);
        str.reverse();        
        System.out.println(str);


Время поиска : 920.880383 миллисеунд. Примерно 0.920 секунды

Это УЖАСНО долго на самом деле. нужно не более чем  0.1 секунда.

я думаю что основное время затрачивается на
Код

         ht.load(fin);


потому-что каждый раз при исполнении. это выполняется.

вопрос 1: можно ли как-то сразу при компиляции загрузить этот файд d.dat. что бы исполнении его уже не надо было загружать.
вопрос 2: какой есть более эффективный способ хранения информации, что бы затраты(по времени) на поиск нужного значения были сведены к минимуму.

PM   Вверх
shimopus
Дата 9.12.2006, 14:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 103
Регистрация: 25.8.2006

Репутация: 1
Всего: 1



1. А зачем при компиляции? Можно при запуске сразу считывать его, но это будет неоправданно, на мой взгляд, забивать ОП. Особенно, когда там будет триллион записей. А при компиляции - это сразу же создать явно переменную, проинициализированную информацией из d.dat
2. Ну самый быстрый - это в ОП. Из других... может быть БД?

Это сообщение отредактировал(а) shimopus - 9.12.2006, 14:37
PM ICQ Skype GTalk   Вверх
powerOn
Дата 9.12.2006, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата(TupleCa @  9.12.2006,  14:29 Найти цитируемый пост)
вопрос 2: какой есть более эффективный способ хранения информации, что бы затраты(по времени) на поиск нужного значения были сведены к минимуму.

Используйте индексирование. При нем, сначало строится оптимизированный файл индекса. А поиск происходит только по нему (индексу). 
Вот вам в помощь Apache Lucene.


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
TupleCa
Дата 9.12.2006, 16:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 110
Регистрация: 7.11.2006

Репутация: нет
Всего: нет



как вот это
Код

        ht.load(fin); 

выполнить сразу при объявлении ht. 
d.dat 6мб, впринцыпе для меня это не критично.
зато скорость 0.360242 миллисеунд. 



PM   Вверх
_Y_
Дата 9.12.2006, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1651
Регистрация: 27.11.2006

Репутация: 5
Всего: 34



Когда-то, лет 12 назад, на первом еще VB я столкнулся с проблемой булева поиска в текстовой БД. На тот момент и память была маленькой и процессор быстро информацию не жевал. Решение было примерно такое:
  • Файл был единый, но грузился не целиком, а по блокам, ну, скажем по N строк. 
  • Блок грузился и объединялся в сплошной текст с разделительными, текстовыми же, символами. 
  • Велся поиск в этой одной огромной "строке". 
  • Если нужное не находилось - грузился следующий блок. 
  • Записи, естественно, лежали в файле упорядоченно и грузился не первый блок, а блок наиболее вероятно содержащий искомую информацию.  
  • При новом поиске сначала обыскивался блок уже лежащий в памяти (все равно уж он там); это часто помогало точнее определить какой блок грузить следующим.
Звучит все это, конечно, дико, но народ приходил ко мне удивляться как быстро эта крокозябра работала.


--------------------
Я вот в этом поучаствовал: http://sbor-nik.appspot.com/kick.jsp?id=sbor5737960678883328 (на правах саморекламы:)
PM MAIL WWW   Вверх
LSD
Дата 10.12.2006, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



По моему в данном случае явное непонимание, того как это все должно работать. В данном случае без индекса не обойтись, можно его делать руками, как описал _Y_. Можно использовать готовы решения типа Apache Lucene. А можно просто использовать механизм индексирования СУБД.

P.S. Прикола ради посчитай сколько это 1 триллион записей по 10 байт ;)


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Tony
Дата 11.12.2006, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1159
Регистрация: 3.3.2006
Где: Riga

Репутация: нет
Всего: 12



Бери FileChanel класс. И 4итай нужное коли4ество байт а не всю строку за раз.

ID 32(bytes)                            stroka(255bytes)
dfmg493t04kdhfgdfh...............Moja.stroka........
893bg8gb43t934t43...............Stoka.nomer.2....

Так вот во время 4теня ты 4итешь 32 байта если ID=запросу ID, to 4итаешь следующие 255 байт. Если не равны то пропускаеш  255 байт fileChanel.position(fileChannel.position()+255).


--------------------
user posted image
user posted image
PM MAIL Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0627 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.