powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / быстрый поиск в файле
38 сообщений из 38, показаны все 2 страниц
быстрый поиск в файле
    #34095030
Гость1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, All!

Подскажите, плз, ламеру в джаве - как сделать быстрй поиск текста в файле?
файл 100М, пробовал что-то типа:

FileReader fr = new FileReader (fpath);
BufferedReader br = new BufferedReader(file_name);
String s;
while ((s = br.readLine()) != null) {
boolean fl_a = false;
if (s.length() != 0) {
String sa = s.substring(0,9).trim();
if (sa.equals(search_string)) fl_a = true;
...

сек 20 лопатит...-(

заранее благодарен!
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095128
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RandomAccessFile, метод read
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095215
Гость1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доступно и понятно ;)
тнкс а лот...примерчика какого не будет? чем, вернее насколько данный метод быстрее будет?
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095267
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость1111Доступно и понятно ;)
тнкс а лот...примерчика какого не будет? чем, вернее насколько данный метод быстрее будет?
Через 5 минут после прочтения вашего первого сообщения, я впервые узнал о существовании такого класса и успел разобраться, как с его помощью можно решить вашу задачу.
Не вижу причин, чтобы вы делали по другому.
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095276
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Более того - я успел протестировать скорость работы - она довольно высока (не более 1.5 секунд на чтение 120-ти мегабайтного файла)
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095299
Гость1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо еще раз. теперь есть критерий ориентировочный - открою доку -)
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095478
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
он же
Через 5 минут после прочтения вашего первого сообщения, я впервые узнал о существовании такого класса и успел разобраться, как с его помощью можно решить вашу задачу.


Знаком с этим классом много лет, но сомневаюсь, что RandomAccessFile поможет реализовать задачу поиска текста в файле. Этот класс дает возможность огранизовать доступ к произвольному месту в файле на чтение или запись, но как это поможет при поиске текста ?
Если Вы заранее знаете место расположение текста в файле, тогда понятно :)
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095510
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov
Знаком с этим классом много лет, но сомневаюсь, что RandomAccessFile поможет реализовать задачу поиска текста в файле. Этот класс дает возможность огранизовать доступ к произвольному месту в файле на чтение или запись, но как это поможет при поиске текста ?
Если Вы заранее знаете место расположение текста в файле, тогда понятно :)
Ну что вы в самом деле.
Не писали в детстве свой regexp на паскале?
Там не было ничего кроме возможности максимально быстро получить набор байтиков из файла.

Я смотрю, в Java ситуация ровно такая же. Хочешь чтобы всё максимально быстро и эффективно работало - пиши своё. И это хорошо.
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095511
Гость1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kachalov он же
Через 5 минут после прочтения вашего первого сообщения, я впервые узнал о существовании такого класса и успел разобраться, как с его помощью можно решить вашу задачу.


Знаком с этим классом много лет, но сомневаюсь, что RandomAccessFile поможет реализовать задачу поиска текста в файле. Этот класс дает возможность огранизовать доступ к произвольному месту в файле на чтение или запись, но как это поможет при поиске текста ?
Если Вы заранее знаете место расположение текста в файле, тогда понятно :)

И что Вы можете порекомендовать?
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095518
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Причем непонятно - у автора файл типизированный или нет?
Это просто текст в разнобой?
Нужно искать просто какую-то уникальную строку?
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095562
Гость1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
файл типизированный 46 байт в строке, затем CR
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095703
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость1111файл типизированный 46 байт в строке, затем CR
- это очень хорошо! это дает возможность легко разбить файл на блоки (кратные 47), которые будут анализироваться отдельно (параллельно).

Когда то мне поставили задачу парсить гигабайтных размеров текстовый файл со статистикой. Для анализа больших файлов можно разбивать их на куски (тут действительно поможет RandomAccessFile), а каждый кусок анализировать в отдельном потоке, т. е. создать многопоточное приложение. Правда здесь возникают другие проблемы, лимитом скорости обработки становится не жесткий диск, а недостаток мощности процессора, т. е. достигается почти 100% загрузка процессора.
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095727
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если не хочется заморачиваться с потоками - можно просто читать Nx(46+1) и сравнивать без проблем :)
Будет очень быстро.
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095743
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
он жеБудет очень быстро.
- быстрее чем BufferedReader не будет. Проверено. При линейном чтении файла использование этого потока дает максимально возможный эффект (размер буфера по умолчанию 256, что не хуже чем 47).

- еще один путь повышения эффективности - аккуратные действия со строками. Substring, trim, не дай Бог match, при многократном вызове заметно замедляют программу, попробуйте indexOf - он работает быстрее!
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095815
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
читать не линейно, а блоками :)
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095816
Гость1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kachalov он жеБудет очень быстро.
- быстрее чем BufferedReader не будет. Проверено. При линейном чтении файла использование этого потока дает максимально возможный эффект (размер буфера по умолчанию 256, что не хуже чем 47).

- еще один путь повышения эффективности - аккуратные действия со строками. Substring, trim, не дай Бог match, при многократном вызове заметно замедляют программу, попробуйте indexOf - он работает быстрее!

Да, но я вроде как BufferedReader с его readline и использовал...
indexOf конечно попробую, но думается заметно быстрее не будет...

А что посоветутете если загонять данные в байтмассив по 1М и далее читать его в цикле? Понимаю, что вопросы ламерские...-)
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095853
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость1111Да, но я вроде как BufferedReader с его readline и использовал...
indexOf конечно попробую, но думается заметно быстрее не будет...

- будет, будет. 100Mb/47byte=2.2 млн. строк. Если 2 миллиона раз выполнять не оптимизированые действия можно много потерять в производительности.
Гость1111
А что посоветутете если загонять данные в байтмассив по 1М и далее читать его в цикле? Понимаю, что вопросы ламерские...-)
- вопрос не ламерский :) Не попробовав не ответишь. Я уже попробовал :( Это почти ничем не отличается по быстродействию от BufferedReader, хотя возможны варианты в зависимости от того какие жесткие диски Вы используете.
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095862
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
он жечитать не линейно, а блоками :)
- а блоками читать как? по очереди? т. е. линейно как при наличии буфера, только буфер будет не 256 байт как по умолчанию в буферизованых потоках, а 47, кстати размер буфера в буферизованых потоках можно менять, задайте его в 47 байт и Вы увидите, что ничего не изменилось.

- а если блоки читать паралельно, по моему, никак без многопоточности не обойтись.
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095896
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095901
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А я так хорошо пил пиво...
См. аттач.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
C:\Program Files\Java\jdk1. 5 .0_07\bin>javac FileProcessor.java 

C:\Program Files\Java\jdk1. 5 .0_07\bin>java FileProcessor w 
Wrote  250000   470 -bytes records in  3359  msec

C:\Program Files\Java\jdk1. 5 .0_07\bin>java FileProcessor r 
Proceed  117500000  bytes records in  4032  msec with  2500000  failures

...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095903
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доводку напильником оставляю на совести того, кому этот пример пригодится :)
А доводка нужна. Начиная с обработки EOFException и заканчивая оптимальным выбором MULT.

Я ответил на вопрос
Kachalov он жечитать не линейно, а блоками :)
- а блоками читать как? по очереди?
? :)
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34095976
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
он жеЯ ответил на вопрос
Kachalov он жечитать не линейно, а блоками :)
- а блоками читать как? по очереди?
? :)
- выходит читаете по очереди блоками, т. е. линейное чтение, если то же самое сделате с буферизованым потоком, результаты по быстродействию будут те же самые, а код получится проще. Представленное решение иллюстрирует как можно с помощью класса RandomAccessFile создать аналог буферизованого чтения :(

P. S. не обязательно было писать этот код, основы программирования на Java многим знакомы :)
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34096019
LINUXER
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен что RandomAccessFile врятли поможет
Есть мудрые алгоритмы типа КМП(Кнута — Морриса — Пратта)
Врятли захочется с ними возиться, но если выигрыш в скорости действительно нужен ..
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34096256
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov
- выходит читаете по очереди блоками, т. е. линейное чтение, если то же самое сделате с буферизованым потоком, результаты по быстродействию будут те же самые, а код получится проще. Представленное решение иллюстрирует как можно с помощью класса RandomAccessFile создать аналог буферизованого чтения :(

P. S. не обязательно было писать этот код, основы программирования на Java многим знакомы :)
Боюсь, основы плохо знакомы.
Иначе вы не говорили бы, что 3.5 сек (моё решение) и 5.8 сек (BufferedReader) - это одинаковая скорость. И это в случае уже закэшированного виндой файлика.
Если обрабатываем с чтением, то цифры:
Proceed 290374304 bytes records in 11031 msec with 6178176 failures
Proceed 287888895 buffered bytes in 26422 msec with 2537871 failures
Только тут не совсем честно, т.к. файлы совершенно произвольные.
А может вы хотите чтобы всё парсилось еще в 5 раз быстрее? Тогда с Java нужно уходить с сторону плюсов.


Код, как я понял, приводить не нужно.
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34097649
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Гость111, он же

Я - бы предложил упростить постановку.

1) Давайте считать, что мы ищем в структурированом бинарном файле (размер структуры = 47 байт) подстроку байтов в поле типа byte[9] по смещению 0 от начала структуры.

В этом случае, можно "забить" на строковые операции и делать поиски прямо по буферу чтения.

Искомую строку можно заранее сконвертировать в байтовый массив.

Условно считаем, что байт = символ в коде ASCII.

2) Подозреваю, что следующие операции в теле цикла
Код: plaintext
1.
2.
3.
byte tempArray[] = new byte[SEARCHABLESIZE];
System.arraycopy(array10, i * SIZE, tempArray,  0 , SEARCHABLESIZE);
String xString = new String(tempArray).trim();
избыточны, и без них можно вполне обойтись.

3) Меня удивляет что CurrentTimeMillis() выдает (в Windows) сильно "загрублённое" время. И время работы процеса (разность между снапшотами) я вижу - как константу. Это настораживает. Поэтому в качестве функции снапшота времени предлагаю использовать не CurrentTimeMillis(), а nanoTime()/1000000. Она более точна ИМХО.

С уваженим.
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34097768
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
он же
Боюсь, основы плохо знакомы.
Иначе вы не говорили бы, что 3.5 сек (моё решение) и 5.8 сек (BufferedReader) - это одинаковая скорость. И это в случае уже закэшированного виндой файлика.
Если обрабатываем с чтением, то цифры:
Proceed 290374304 bytes records in 11031 msec with 6178176 failures
Proceed 287888895 buffered bytes in 26422 msec with 2537871 failures
Только тут не совсем честно, т.к. файлы совершенно произвольные.

- на одном и том же файле с данными размером 500Мб (искомые данные в последней строке), Ваш вариант поиска дал 18266 мс, а заметно более простой код с использованием BufferedReader и метода startsWith для поиска вхождения в строку, дал 25610 мс. Разница в быстродействии около 30% (хотя сознаюсь, я и такой не ожидал), а в сложности кода 3-х кратная.
На всякий случай приведу пример кода (хотя он совершенно тривиальный), чтобы не было разночтений:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
 import  java.io.*;

 public   class  ReaderBuffered {

     public   static   void  main (String[] arg)  throws  Exception {
        String file="test.dat";
         boolean  find=false;
        BufferedReader in= new  BufferedReader( new  FileReader(file));
         long  startTime=System.currentTimeMillis();
        String line= null ;
         while ((line=in.readLine())!= null ){
            //pseudo smart activity
             if (line.startsWith("0123456ok")){
                find=true;
                 break ;
            }
        }
        System.out.println("search time: "+(System.currentTimeMillis()-startTime)+" msec");
        System.out.println("find string: "+find);
        in.close();
    }
    
}
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34097797
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(' 1234567 ').startsWith != (' 1234567 8899').substring(0,9).trim()

Хотя может автору это и не нужно.
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34097802
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
!= - это конечно означает "не равны" (не равны методом equals) :)
чтобы не было разночтений :)
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34097890
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
он же!= - это конечно означает "не равны" (не равны методом equals) :)
чтобы не было разночтений :)
- это был один из тезисов: "оптимизировать работу с текстом" :)

- изначально сравнение производил на Windows 2000 диск SATA:
Код: plaintext
1.
2.
   25610 мс BufferedReader
   18266 мс RandomAccessFile + arraycopy

- решил проверить на Linux FC4 и SATA RAID 1 (процессоры и материнские платы на сравниваемых машинах одинаковые) и получил интересный результат:
Код: plaintext
1.
2.
   13994 мс BufferedReader
   15567 мс RandomAccessFile + arraycopy
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34098256
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov
Код: plaintext
1.
2.
   13994 мс BufferedReader
   15567 мс RandomAccessFile + arraycopy

Усредненное из 3-5 попыток?
Или после перезагрузки и принудительной очистки файла подкачки?

Если сразу же друг за другом - эксперимент не выдерживает никакой критики :)
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34098385
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
он же
Если сразу же друг за другом - эксперимент не выдерживает никакой критики :)
- 3 попытки по очереди для каждого примера, т. е. пример1-пример2-пример1-пример2 и т. д.

- усреднять не стал, взял не крайние значения

- Linux сервер рабочий, средне нагруженый, паралелльно с тестами работал web-сервер и БД что, я думаю, хорошо отражает реальные условия работы.

- если не лень погоняйте примеры сами на разных машинах, а то как цифры не нравятся, так "эксперимент не выдерживает никакой критики", а как получается удобный результат, так никаких вопросов о качестве тестов не возникает :)
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34098513
он же
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kachalov
- если не лень погоняйте примеры сами на разных машинах, а то как цифры не нравятся, так "эксперимент не выдерживает никакой критики", а как получается удобный результат, так никаких вопросов о качестве тестов не возникает :)
Я не сомневаюсь в своих тестах, т.к. сам их проводил :)
А про вас мне ничего не известно. Может вы злой и хитрый

Ладно, что-то отклонились от темы :)
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34098634
json
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://forum.java.sun.com/thread.jspa?threadID=476507&tstart=60

искать в тексте слова: public class searcher
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34098650
json
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34099143
Solaroid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kachalov он же!= - это конечно означает "не равны" (не равны методом equals) :)
чтобы не было разночтений :)
- это был один из тезисов: "оптимизировать работу с текстом" :)

- изначально сравнение производил на Windows 2000 диск SATA:
Код: plaintext
1.
2.
   25610 мс BufferedReader
   18266 мс RandomAccessFile + arraycopy

- решил проверить на Linux FC4 и SATA RAID 1 (процессоры и материнские платы на сравниваемых машинах одинаковые) и получил интересный результат:
Код: plaintext
1.
2.
   13994 мс BufferedReader
   15567 мс RandomAccessFile + arraycopy
Где взять стомегабайтный файл? И что вы в нем ищете?
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34099259
Kachalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SolaroidГде взять стомегабайтный файл? И что вы в нем ищете?
- думаю это вопрос не ко мне :) посмотрите на первое сообщение в теме.
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34099438
Гость1111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Solaroid Kachalov он же!= - это конечно означает "не равны" (не равны методом equals) :)
чтобы не было разночтений :)
- это был один из тезисов: "оптимизировать работу с текстом" :)

- изначально сравнение производил на Windows 2000 диск SATA:
Код: plaintext
1.
2.
   25610 мс BufferedReader
   18266 мс RandomAccessFile + arraycopy

- решил проверить на Linux FC4 и SATA RAID 1 (процессоры и материнские платы на сравниваемых машинах одинаковые) и получил интересный результат:
Код: plaintext
1.
2.
   13994 мс BufferedReader
   15567 мс RandomAccessFile + arraycopy
Где взять стомегабайтный файл? И что вы в нем ищете?

100М это средний файлик, есть еще и 150-200М, записи в них не большие, но их много (150М окло 3,5 млн.записей) и это объем данных за один день, а искть нужно в данных за месяц...
Дело в том, что хранить данные записи файлов (это телефония) в данный момент в БД возможности нет, поэтому реализован поиск в файлах (которые с сетевого ресурса замапены на никс).

На данный момент самое быстрое найденное решение (для моего случая работы с БД Оракле) - это использование sqlloadera и с установкой фильтра в ctl-файле (да простят меня те, кто не работает с Оралке)

Тема разумеется еще не закрыта - буду копать дальше в сторону Java, но уж больно Оракле заточил хорошо свой SQLLOADER, боюсь в данном случае это будет самым оптимальным решением.

Большое спасибо ВСЕМ, кто принял и примет участие! ;)
...
Рейтинг: 0 / 0
быстрый поиск в файле
    #34470989
Master Alex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гость1111
100М это средний файлик, есть еще и 150-200М, записи в них не большие, но их много (150М окло 3,5 млн.записей) и это объем данных за один день, а искть нужно в данных за месяц...
Дело в том, что хранить данные записи файлов (это телефония) в данный момент в БД возможности нет, поэтому реализован поиск в файлах (которые с сетевого ресурса замапены на никс).


Индексы стоить для файлов и класть рядом не пробовали?
...
Рейтинг: 0 / 0
38 сообщений из 38, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / быстрый поиск в файле
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]