powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Java [игнор отключен] [закрыт для гостей] / BufferedReader, пропустить строку
35 сообщений из 35, показаны все 2 страниц
BufferedReader, пропустить строку
    #39833211
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Для чтения строк из файла большого размера использую BufferReader.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
BufferedReader reader = new BufferedReader(                     
            		new InputStreamReader(                             
            				new FileInputStream(pathToFile), charset));

String line = reader.readLine();
while(line != null){
   // обработка строки
   .....
   try{
      line = reader.readLine();
   }catch (OutOfMemoryError e){
      // Обрабтка ошибки
   }
}


На одной из строк ловлю OutOfMemoryError.
Проверяю, вижу, что эта строка в файле некорректная, и имеет огромную длину, так что OutOfMemory вполне логичен.
Думаю, что правильнее всего будет в секции catch перейти на следующую строку, чтобы продолжить обработку файла.
Но никак не могу сделать этот переход, у BufferReader для перехода на следующую строку есть только метод readLine(), а он опять пытается прочитать ту же строку, и опять ловит OutOfMemory.
BufferReader использую потому, что он нормально и быстро работает с большими файлами, и ему можно указать кодировку файла.

Подскажите, как мне решить проблему?
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833225
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ГужановДумаю, что правильнее всего будет в секции catch перейти на следующую строку, чтобы продолжить обработку файла.может тогда не читать построчно а ПРЕДВАРИТЕЛЬНО узнавать размер строк?
Это от бизнес логики зависит.
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833239
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант:
- у оси спрашиваете размер.
- посчитали нужную память для целиком в память. Либо поиск конца строки в цикле и имеем размер строк
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833242
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В файле строки разные по длине.
Искать конец строки - не вариант, файл может быть в несколько гигабайт, миллионы строк. И имеются требования по быстродействию
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833243
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
То есть нужно быстро, но с пропусками так как памяти мало. Так?
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833245
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, если проблемная строка, то ее пропустить, записав информацию в лог
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833252
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ГужановДа, если проблемная строка, то ее пропустить, записав информацию в логчитай с начальной позиции Следующая. Но для этого надо знать размпр проблемной.
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833254
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предполагаю, что размер проблемной строки может быть любым.
Единственное, что может быть можно использовать - мне известен максимальный возможный размер правильной строки
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833256
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ГужановПредполагаю, что размер проблемной строки может быть любым.я намекал что без поиска конца строки по спецсимволу и выхода на размер проблемной НЕ ВЫЙДЕТ.
ИМХО
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833257
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но получаю строку я в line = reader.readLine(), ловлю ошибку, и ридер не переходит на следующую строку. В catch я вижу, что в line осталась предыдущая строка, которая корректна. Если я в catch пытаюсь пойти дальше (line = reader.readLine(), то опять получаю ту же ошибку.
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833258
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если имеется ввиду где в jre готовая реализация то такой нет если неошибаюсь, придется руки испачкать и написать самому.
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833262
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
Думаю поиск в тексте будет несравнимо быстрее чем логика обработки.
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833263
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ГужановНо получаю строку я в line = reader.readLine(), ловлю ошибку, и ридер не переходит на следующую строку. В catch я вижу, что в line осталась предыдущая строка, которая корректна. Если я в catch пытаюсь пойти дальше (line = reader.readLine(), то опять получаю ту же ошибку.позиция не сменилась так как не прочитано. Что удивляет?
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833264
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
llemingЕсли имеется ввиду где в jre готовая реализация то такой нет если неошибаюсь, придется руки испачкать и написать самому.готового чего? Найти символ в гиговом файле?
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833266
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,

Не удивляет. Просто говорю, что я эту строку не получил, поэтому с ее размером играться не могу
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833267
Фотография Dmitry.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ловить outofmemory стремно.
екстенднуть bufferedreader и сделать свой readLine с лимитом по длине строки.
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833275
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ГужановPetroNotC Sharp,

Не удивляет. Просто говорю, что я эту строку не получил, поэтому с ее размером играться не могуеще раз.
Алгоритм такой что нужно искать конец строки прежде чем читать в память.
Понял?
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833283
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp,
Это я понял. Но вот никак не могу придумать, как это реализовать. Ведь если строка не в памяти, то как с ней манипулировать?
Если же я ее прочитаю (reader.readLine()), то получу outOfMemory
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833285
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
Если нет indexOf("\n
То циклом искать.
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833286
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
Есть метод read по символьный. Дай сюда скорость прохода по всему файлу.
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833288
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
по файлу в 1300000 строк (файл для отладки, реальный больше) с обработкой и сохранением строк в БД тратится примерно 2.5 - 3 минуты
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833290
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
indexOf("\n") надо искать в строке. А у меня этой строки нет, т.к. вылетаю с ошибкой
Если все строки читать посимвольно, то, есть опасение, что я зависну совсем надолго
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833294
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
1. Дай скорость посимвольного чтения БЕЗ ВСЕГО.
2. ПЕРЕД reaLine прочти в буфер 100 символов и там ищи конец строки.
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833295
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов1300000 строк3. Валидируй в фоне файлы на входе.
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833303
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Метод read() возвращает число
The character read, as an integer in the range 0 to 65535 (0x00-0xffff), or -1 if the end of the stream has been reached
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833307
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
А причем тут что возвращает?
"Прочитать 100 символов в буфер" выше писал.
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833308
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если предположить, что я считал посимвольно 100 символов и не нашел там конец строки, то мне надо перейти на следующую строку. А как это сделать? Переход в BufferedReader происходит при readLine(), а он вызывает ошибку
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833310
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А \r и \n имеют вполне конкретные коды. Удивительно, да?
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833313
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел ГужановЕсли предположить, что я считал посимвольно 100 символов и не нашел там конец строки, то мне надо перейти на следующую строку. А как это сделать? Переход в BufferedReader происходит при readLine(), а он вызывает ошибкуда. Тогда читай по символьно до конца. Раз нельзя отбросить целиком невалидный файл. Парси его весь.
Цифры сюда дать 10 минут.
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833343
lleming
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC SharpllemingЕсли имеется ввиду где в jre готовая реализация то такой нет если неошибаюсь, придется руки испачкать и написать самому.готового чего? Найти символ в гиговом файле?

топикстартер спрашивает нет ли чтото вроде этого

Код: java
1.
while(line != null || !reader.lastState().isLineTooLong()){



найти символ подразумевает его искать т.е писать код алгоритма поиска.
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833353
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lleming,
ОК
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833380
Павел Гужанов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем спасибо за помощь.
Сделал так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
try {
        line = reader.readLine();
} catch (OutOfMemoryError e) {
	logger.error("Слишком большая строка " + counter);
	int symbol = reader.read()ж
	int i = 0;
	while(symbol != 10 && symbol != 13) {
		i++;
		symbol = reader.read();
	}
	logger.error("Длина строки " + i);
	line = reader.readLine();
	if(line != null && line.length() == 0)
	        line = reader.readLine();
}
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833414
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов,
+1
Только лучше не доводить до райзе по памяти.
Ну и цифры не дал. Жаль.
Удачи!
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833486
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Павел Гужанов
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
BufferedReader reader = new BufferedReader(                     
            		new InputStreamReader(                             
            				new FileInputStream(pathToFile), charset));

String line = reader.readLine();
while(line != null){
   // обработка строки
   .....
   try{
      line = reader.readLine();
   }catch (OutOfMemoryError e){
      // Обрабтка ошибки
   }
}


Несколько мыслей.

Предположительно. Файл который ты читаешь - не совсем текстовый.
Потому-как сломать мозг хипу можно реально ооооочень длинными строками.
По факту Java поддерживает индексацию символов до 2 млрд. Но беря во внимание
что BufferedReader внутри использует StringBuffer который может делать реаллокации.
А реаллокации требуют 2 * n памяти плюс хвостик на расширение. Тут возможны варианты
что не хватило не памяти. А не хватило временной памяти которая нужна буферному ридеру
для копирования староого символьного массива в новое место. Но это моё предположение.
Я не изучал как работает этот ридер.

Железное решение твоей проблемы - читать файл не построчно а посимвольно. И принимать
решение на каждый символ. Формировать строки. С пониманием предметной области.
...
Рейтинг: 0 / 0
BufferedReader, пропустить строку
    #39833493
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
}catch (OutOfMemoryError e){
      // Обрабтка ошибки
}


Так обычно не делают. Ошибка OOM не предполагает ее оперативного решения.
Она просто к сведению перед тем как исполнительная среда упадет. Обычно
если это происходит то память не удалось освободить и нет ресурсов на ее решение.
...
Рейтинг: 0 / 0
35 сообщений из 35, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / BufferedReader, пропустить строку
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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