|
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 |
|
|
start [/forum/topic.php?fid=59&fpage=25&tid=2121220]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
75ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 237ms |
total: | 413ms |
0 / 0 |