|
|
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
Вопрос: как в java прочитать в переменную большой файл? Или что я делаю не так? Вот код Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Код: java 1. 2. 3. По какой то загадочной для меня причине при достижении c_count = 37_748_000 программа вылетает по ошибке: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. Read_Log.java:77 это Код: java 1. Пробовал в netbeans: Выполнить, конфигурация проекта, настроить, аргументы -- ставить разные аргументы до -Xmx4000m -Xms2000m не помогает совсем никак. Я хочу прочитать файл 61 мБ, но мне надо будет читать до нескольких сотен мБ. Что не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 08:46 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
Код: java 1. 2. 3. 4. 5. 6. 7. azsxкак в java прочитать в переменную большой файл?Зачем? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 11:38 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
Пока - непонятно. Но код изначально имеет code smells. У тебя - кмк путаница с использованием API для чтения файлов. - Почему объявлен целый стек текстового API InputStreamReader -> BufferedReader но при этом ты читаешь 1 символ? Читай блоками фиксированной длины или строками (до символа перевода строки). - Почему используется StringBuffer? Он - для мультипоточности. Используй StringBuilder. - В Apache commons IO есть готовые API для прочтения текстового файла в строку. Если для тебя это не предмет изучения а просто нужно - то используй его. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 11:43 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
marcomanЗачем? http://www.sql.ru/forum/1266058/kak-chitat-log-na-java ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 11:44 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
в коде ничего предосудительного не вижу за исключением, что чтение ведется посимвольно. для сравнения: код наиболее используемой библиотеки для таких задач - org.apache.commons.io.IOUtils Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. скорее всего ты где-то не там ставишь настройки памяти... для информации: ты читаешь свой файл в одно-байтовой кодировке (cp866) т.е. каждый байт из файла представлен в памяти в виде одного char = 2 байта StringBuffer при нехватке размера внутреннего буфера создает его копию двойного размера что приводит в худшем случае к тройному использованию памяти. OutOfMemory у тебя выпадает на 37_748_000 символах x 2 = 75_496_000 байт x 3 = 226_488_000 байт что очень близко к дефолтному пределу памяти можно StringBuilder создавать по размеру файла тогда не будет х3 использования памяти при чтении но во время StringBuilder.toString() будет x2 а лучше избежать чтения всего файла в память... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 11:49 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
azsx, Не используйте String для таких объемов. Вам всё равно такая огромная строка целиком не нужна. Особенно в Java 8, где один char это гарантировано 2 байта. Большие файлы нужно парсить прямо во время чтения. Вам нужен Reader или Scanner, или оба, чтобы при чтении разбивать и складывать в структуру оптимизированную для представления. Правда, тут хитрый вопрос. В Java 8 лучше держать данные в byte[], а в String конвертировать только во время представления на UI. А вот для Java 9 можно смело держать всё в String-ах. Если все символы умещаются в байты, то String будет держать только byte[]. Если задача только парсить, то блин, вообще не надо хранить всё в памяти. Читайте построчно и анализируйте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 12:19 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
azsxкак в java прочитать в переменную большой файл? У вас маленький файл. azsxИли что я делаю не так? Вот что: Код: java 1. Накапливаются удалённые, но не вычищенные из памяти объекты. На это намекает сообщение java.lang.OutOfMemoryError: Java heap space. Каждый раз, когда StringBuffer увеличивается сверх текущей ёмкости, удаляется массив char[], в котором фактически хранятся его данные (сначала они копируются в новый массив, созданный для этого StringBuffer). Поскольку вы увеличиваете StringBuffer на 1 символ, то удалений прежних массивов будет много. Во избежание этого можно с самого начала закрепить за StringBuffer большую ёмкость: new StringBuffer (ёмкость) и потом увеличивать его больше, чем на один символ - добавлять в него не символ, а целую строку или применять StringBuffer.ensureCapacity (желаемая ёмкость). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 12:21 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
marcoman попробовал Вашим методом, теперь памяти не хватает на строке Код: java 1. Код: java 1. 2. 3. 4. 5. 6. 7. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. авторскорее всего ты где-то не там ставишь настройки памяти... Скорее всего, не понимаю как их ставить там. оффтопик автор- Почему используется StringBuffer? Он - для мультипоточности. Используй StringBuilder. как я понимаю надо рассчитывать, что когда нибудь я буду писать программы на java, а не утилиты. Один из серьёзных плюсов java над pascal -- это более понятная и удобная в реализации многопоточность. Мне уже сейчас надо 2 файла анализировать, можно одновременно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 12:33 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
azsx, Вы бы параметры VM писали бы не в аргументы, а в параметры VM. Может тогда бы они и применились. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 12:35 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
azsxкак я понимаю надо рассчитывать, что когда нибудь я буду писать программы на java, а не утилиты. Один из серьёзных плюсов java над pascal -- это более понятная и удобная в реализации многопоточность. Мне уже сейчас надо 2 файла анализировать, можно одновременно. Вам не нужно загружать файл целиком в память, чтобы его проанализировать. Даже если файл имеет не потоковую структуру, то можно использовать RandomAccessFile. Но лог, он потоковый. Обычно, строго упорядочен по времени. Толку от того что он у вас целиком в памяти - ноль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 12:39 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
Да ему не нужно весь лог в строку прогружать. Все равно это - пол задачи. Вот пускай автор расскажет что он дальше будет делать с этой толстой строкой. А то накидают ему тут советов.... байты читать. Вообще не в тему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 12:40 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
maytonДа ему не нужно весь лог в строку прогружать. Все равно это - пол задачи. Вот пускай автор расскажет что он дальше будет делать с этой толстой строкой. А то накидают ему тут советов.... байты читать. Вообще не в тему. Я было подумал, что он UI пишет для этого файла. Но теперь вижу что парсить собрался. Парсить лог файл вообще примитивная задача - читаем строками, анализируем регулярками. Можно даже через Java 8 Stream API. https://www.mkyong.com/java8/java-8-stream-read-a-file-line-by-line/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 12:44 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
авторВы бы параметры VM писали бы не в аргументы, а в параметры VM. Вот он ответ, огромное спасибо. Как я сам не подумал, что надо в vm писать. Плохо, что теперь gui приложение придётся не с одного jar файла запускать, а с sh, bat -- три файла. ээх... авторВот пускай автор расскажет что он дальше будет делать с этой толстой строкой. Образно, от программ идёт лог, где помимо всякой информации есть строки: error-XXXX краткое, человеко понятное описание ошибки."\r\n" По очень многим ошибкам можно отсылать майл юзеру автоматом "Вы не прочитали инструкцию (текст инструкции), читайте внимательнее". Я думаю, что буду читать эти файлы каждые 5 минут и посылать письма. Не понимаю, почем и что я делаю не так? Зачем мне постоянно держать эти файлы открытыми даже для чтения? --- Накапливаются удалённые, но не вычищенные из памяти объекты. Спасибо, учту, типа StringBuffer strBuff = new StringBuffer(80000000); оффтопик авторНе используйте String для таких объемов. Вам всё равно такая огромная строка целиком не нужна. Ну это я ваще не понимаю. У меня 6 гб оперативной, мне нужна эта строка для обработки, обработка посимвольно будет гораздо сложнее и запутанее. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 13:00 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
Кстати, пример с байтами мне показался более логичным для чтения файла. Это не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 13:00 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
azsxОбразно, от программ идёт лог, где помимо всякой информации есть строки: error-XXXX краткое, человеко понятное описание ошибки."\r\n" По очень многим ошибкам можно отсылать майл юзеру автоматом "Вы не прочитали инструкцию (текст инструкции), читайте внимательнее". Я думаю, что буду читать эти файлы каждые 5 минут и посылать письма.1440 / 5 = 288 сообщений в сутки. Вас и проклянут и наплюют вам в карму. Борьба с ошибками "нечитателей инструкции" - задача техподдержки. Использовать для тривиальной задачи ваше странное поделие станут только совсем тупые неадекваты - есть тьма готовых инструментов, которым не требуется гигабайт памяти, чтобы найти строку в пару сотен байт. P.S. Поскольку прозвучало "база данных" я уж совсем молчу про штатные варианты мониторинга ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 14:40 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
1440 / 5 = 288 сообщений в сутки. 1. Много пользователей (больше сотни). 2. Только некоторые из этих ошибок требуют обращения к документации. Сейчас в реальности юзер два три раза пытается сделать одно и то же, потом пишет в ТП и получает копипаст из документации. авторБорьба с ошибками "нечитателей инструкции" - задача техподдержки. Ага. авторесть тьма готовых инструментов, которым не требуется гигабайт памяти, чтобы найти строку в пару сотен байт. я знаю два, php и fpc. Вы знаете ещё? Как бы эту задачу решили Вы? авторP.S. Поскольку прозвучало "база данных" я уж совсем молчу про штатные варианты мониторинга ... Что не так? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 16:46 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
Кстати, не сразу понял. Я же не собираюсь каждые 5 минут одному и тому же пользователю слать документацию одинаковую. И конечно сперва потестю на тестовых ящиках. В 61 мб, было 3600+ ошибок из них некоторые точно можно решить документацией. Мне также интересно было число сколько ошибок всего, а то java логи пишет, кругом исключения, а кто их читает и вылизвыает -- непонятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 17:49 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
azsxКстати, пример с байтами мне показался более логичным для чтения файла. Это не так? Нет. Никогда так не делай. Байты - не для текстовых файлов. Вобщем огребешь больше проблем чем профита. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 17:54 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
azsx1440 / 5 = 288 сообщений в сутки. 1. Много пользователей (больше сотни). 2. Только некоторые из этих ошибок требуют обращения к документации.Это ещё не повод спамить пользователей (см.ниже).я знаю два, php и fpc. Вы знаете ещё?Это не инструменты - это пушки для стрельбы по воробьям. Если "man tail" вам не нравится - попробуйте "man grep", "find /?", в конце концов.Как бы эту задачу решили Вы?Прежде чем бросаться на амбразуру, надо изучить врага проблему. 0. Отделить зёрна от плевел - не всё, что снабжено меткой ЕГГОГ действительно является ошибкой; 1. Понять, что на самом деле требуется - отсутствие ЕГГОГ-ов не может являться (само)целью; "Так вот, чтобы всего этого достичь - надо учиться, учиться и учиться!" (ц) старый анекдот. В вашем случае надо читать логи, пока вы не поймёте, что происходит в вашей системе и пока вам не станет ясно - что можно сделать с вашей стороны, а что придётся оставить как есть и с чем понадобиться бороться совершенно не техническими методами. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 18:00 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
azsxМне также интересно было число сколько ошибок всего, а то java логи пишет, кругом исключения, а кто их читает и вылизвыает -- непонятно.Каждое исключение снабжено трассировкой стэка из которого вполне понятно - кто и где. Почему, как правило, непонятно, но это уже другая история. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2017, 18:03 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
авторВ вашем случае надо читать логи, пока вы не поймёте, что происходит в вашей системе Тогда по сути я этим и займусь, просто максимально автоматизирую всё. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2017, 01:45 |
|
||
|
Как прочитать большой файл?
|
|||
|---|---|---|---|
|
#18+
Настроить логгер, что бы хотя бы ошибки отсаживать в отдельный файл, либо писать в БД ? Написать свой аппендер, что бы он сразу занимался отправкой (надо всего лишь отнаследоваться от SMTP аппендера) ? опять же, может достатьчно взять grep и sed, что бы не писать велосипед? но и в любом случае, данные надо обрабатывать в поточном режиме, а не грузить все в память. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.07.2017, 08:08 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=39489683&tid=2122753]: |
0ms |
get settings: |
9ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
59ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
64ms |
get tp. blocked users: |
1ms |
| others: | 209ms |
| total: | 383ms |

| 0 / 0 |
