|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Здравствуйте. Для чтения строк из файла большого размера использую BufferReader. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
На одной из строк ловлю OutOfMemoryError. Проверяю, вижу, что эта строка в файле некорректная, и имеет огромную длину, так что OutOfMemory вполне логичен. Думаю, что правильнее всего будет в секции catch перейти на следующую строку, чтобы продолжить обработку файла. Но никак не могу сделать этот переход, у BufferReader для перехода на следующую строку есть только метод readLine(), а он опять пытается прочитать ту же строку, и опять ловит OutOfMemory. BufferReader использую потому, что он нормально и быстро работает с большими файлами, и ему можно указать кодировку файла. Подскажите, как мне решить проблему? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 12:43 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Павел ГужановДумаю, что правильнее всего будет в секции catch перейти на следующую строку, чтобы продолжить обработку файла.может тогда не читать построчно а ПРЕДВАРИТЕЛЬНО узнавать размер строк? Это от бизнес логики зависит. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 12:58 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Как вариант: - у оси спрашиваете размер. - посчитали нужную память для целиком в память. Либо поиск конца строки в цикле и имеем размер строк ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 13:13 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
В файле строки разные по длине. Искать конец строки - не вариант, файл может быть в несколько гигабайт, миллионы строк. И имеются требования по быстродействию ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 13:16 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Павел Гужанов, То есть нужно быстро, но с пропусками так как памяти мало. Так? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 13:20 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Да, если проблемная строка, то ее пропустить, записав информацию в лог ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 13:21 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Павел ГужановДа, если проблемная строка, то ее пропустить, записав информацию в логчитай с начальной позиции Следующая. Но для этого надо знать размпр проблемной. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 13:28 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Предполагаю, что размер проблемной строки может быть любым. Единственное, что может быть можно использовать - мне известен максимальный возможный размер правильной строки ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 13:31 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Павел ГужановПредполагаю, что размер проблемной строки может быть любым.я намекал что без поиска конца строки по спецсимволу и выхода на размер проблемной НЕ ВЫЙДЕТ. ИМХО ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 13:34 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Но получаю строку я в line = reader.readLine(), ловлю ошибку, и ридер не переходит на следующую строку. В catch я вижу, что в line осталась предыдущая строка, которая корректна. Если я в catch пытаюсь пойти дальше (line = reader.readLine(), то опять получаю ту же ошибку. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 13:35 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Если имеется ввиду где в jre готовая реализация то такой нет если неошибаюсь, придется руки испачкать и написать самому. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 13:35 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Павел Гужанов, Думаю поиск в тексте будет несравнимо быстрее чем логика обработки. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 13:36 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Павел ГужановНо получаю строку я в line = reader.readLine(), ловлю ошибку, и ридер не переходит на следующую строку. В catch я вижу, что в line осталась предыдущая строка, которая корректна. Если я в catch пытаюсь пойти дальше (line = reader.readLine(), то опять получаю ту же ошибку.позиция не сменилась так как не прочитано. Что удивляет? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 13:37 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
llemingЕсли имеется ввиду где в jre готовая реализация то такой нет если неошибаюсь, придется руки испачкать и написать самому.готового чего? Найти символ в гиговом файле? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 13:39 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, Не удивляет. Просто говорю, что я эту строку не получил, поэтому с ее размером играться не могу ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 13:41 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
ловить outofmemory стремно. екстенднуть bufferedreader и сделать свой readLine с лимитом по длине строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 13:43 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Павел ГужановPetroNotC Sharp, Не удивляет. Просто говорю, что я эту строку не получил, поэтому с ее размером играться не могуеще раз. Алгоритм такой что нужно искать конец строки прежде чем читать в память. Понял? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 13:54 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
PetroNotC Sharp, Это я понял. Но вот никак не могу придумать, как это реализовать. Ведь если строка не в памяти, то как с ней манипулировать? Если же я ее прочитаю (reader.readLine()), то получу outOfMemory ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 13:59 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Павел Гужанов, Если нет indexOf("\n То циклом искать. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 14:01 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Павел Гужанов, Есть метод read по символьный. Дай сюда скорость прохода по всему файлу. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 14:02 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
по файлу в 1300000 строк (файл для отладки, реальный больше) с обработкой и сохранением строк в БД тратится примерно 2.5 - 3 минуты ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 14:08 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
indexOf("\n") надо искать в строке. А у меня этой строки нет, т.к. вылетаю с ошибкой Если все строки читать посимвольно, то, есть опасение, что я зависну совсем надолго ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 14:11 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Павел Гужанов, 1. Дай скорость посимвольного чтения БЕЗ ВСЕГО. 2. ПЕРЕД reaLine прочти в буфер 100 символов и там ищи конец строки. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 14:14 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Павел Гужанов1300000 строк3. Валидируй в фоне файлы на входе. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 14:16 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Метод 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 14:28 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Павел Гужанов, А причем тут что возвращает? "Прочитать 100 символов в буфер" выше писал. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 14:32 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Если предположить, что я считал посимвольно 100 символов и не нашел там конец строки, то мне надо перейти на следующую строку. А как это сделать? Переход в BufferedReader происходит при readLine(), а он вызывает ошибку ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 14:32 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
А \r и \n имеют вполне конкретные коды. Удивительно, да? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 14:33 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Павел ГужановЕсли предположить, что я считал посимвольно 100 символов и не нашел там конец строки, то мне надо перейти на следующую строку. А как это сделать? Переход в BufferedReader происходит при readLine(), а он вызывает ошибкуда. Тогда читай по символьно до конца. Раз нельзя отбросить целиком невалидный файл. Парси его весь. Цифры сюда дать 10 минут. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 14:35 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
PetroNotC SharpllemingЕсли имеется ввиду где в jre готовая реализация то такой нет если неошибаюсь, придется руки испачкать и написать самому.готового чего? Найти символ в гиговом файле? топикстартер спрашивает нет ли чтото вроде этого Код: java 1.
найти символ подразумевает его искать т.е писать код алгоритма поиска. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 14:56 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
lleming, ОК ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 15:03 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Всем спасибо за помощь. Сделал так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 15:34 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Павел Гужанов, +1 Только лучше не доводить до райзе по памяти. Ну и цифры не дал. Жаль. Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 16:14 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Павел Гужанов Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Несколько мыслей. Предположительно. Файл который ты читаешь - не совсем текстовый. Потому-как сломать мозг хипу можно реально ооооочень длинными строками. По факту Java поддерживает индексацию символов до 2 млрд. Но беря во внимание что BufferedReader внутри использует StringBuffer который может делать реаллокации. А реаллокации требуют 2 * n памяти плюс хвостик на расширение. Тут возможны варианты что не хватило не памяти. А не хватило временной памяти которая нужна буферному ридеру для копирования староого символьного массива в новое место. Но это моё предположение. Я не изучал как работает этот ридер. Железное решение твоей проблемы - читать файл не построчно а посимвольно. И принимать решение на каждый символ. Формировать строки. С пониманием предметной области. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 18:01 |
|
BufferedReader, пропустить строку
|
|||
---|---|---|---|
#18+
Код: java 1. 2. 3.
Так обычно не делают. Ошибка OOM не предполагает ее оперативного решения. Она просто к сведению перед тем как исполнительная среда упадет. Обычно если это происходит то память не удалось освободить и нет ресурсов на ее решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.07.2019, 18:21 |
|
|
start [/forum/topic.php?all=1&fid=59&tid=2121220]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
163ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 283ms |
0 / 0 |