|
|
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
Всем привет. Есть текст среднего размера, его надо разбить на слова и вывести затем эти слова в обратном порядке в новый файл. То есть, для входного файла с таким содержимым: Код: java 1. 2. 3. 4. 5. 6. 7. - надо получить на выходе: Код: java 1. 2. 3. 4. 5. 6. 7. Исходный файл небольшой: размер около 8 Мегов, содержит 149 тыс слов (язык - английский). Полазив в интернетах, сделал следующий класс: Код: 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. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. Однако расход памяти в пиковый момент достигает 117 мегов (для всего 8 мегов исходного текста). Покритикуйте, плз, код: я вообще в ту степь полез или надо медитировать над другими способами ? Как уменьшить расход памяти ? Сам текстовый файл тут: http://yadi.sk/d/5UsjXzJ-3VcUs Заранее спасибо за ответы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 18:36:34 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
ozzmosis, Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 20:55:39 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
Два момента: 1. У StringBuilder есть метод insert 2. StringBuilder вам не нужен. Начните с просто ArrayList и при считывание файла заполняйте его в обычном порядке. А вот уже при сохранение в файл делайте обход в обратном порядке. После заполнения arraylist вызовите list.trimToSize(), если вам важно съэкономить память. Этот метод есть только у ArrayList, т.е. переменная должна быть именно этого типа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 20:59:47 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
Usman, Leonidv - спасибо за ответы. Только не взлетело :( Вот два варианта через ArrayList, оба в пиковый момент всё равно жрут 120 мегов: variant-1 : шустрый, 4.5 сек вместо прежних 7.5 Код: 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. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. Output: Код: plaintext 1. 2. variant-2 (от Usman, чуток только подпиленный) Код: 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. 36. 37. 38. 39. 40. Этот вариант медленнее первоначального: Код: plaintext 1. Но самая печалька в том, что все три варианта (первый и эти два) жрут одинаково: около 120 мегов (в аттаче - картинка при запуске var_1). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 22:16:36 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
Это случайно не с T system задание? ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 22:25:47 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
Подключите профайлер (visualvm, например) и через него смотрите, что происходит. Попробуйте запустить JVM с ограничением по памяти. Код: java 1. 2. 3. Так и не должно было быть. Этот прием применяется в том случае, если вам надо обрабатывать данные параллельно и на самом деле важен каждый килобайт. Суть в том, что пиковый размер выделяемой памяти данный метод не меняет, но после его вызова памяти может начать выделяться. Насколько меньше - зависит от размера массива. См. capacity и load factor. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 22:46:31 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
rdmЭто случайно не с T system задание? )Нет :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 22:57:10 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
Я в Джаве новичок, так что не орите , но разве LinkedList не лучше ArrayList, ведь первый оптимизирован для последовательных доступов, т.к. является связанным списком. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 23:06:12 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
LeonidvПодключите профайлер (visualvm, например) и через него смотрите, что происходит. Попробуйте запустить JVM с ограничением по памяти.А как ограничить JVM ? Пытаюсь, но не получается: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. А дока вообще говорит, что: -X Command-line options Код: plaintext 1. 2. 3. PS. D:\JAVA\1Probe>java -version java version "1.6.0_31" Java(TM) SE Runtime Environment (build 1.6.0_31-b05) Java HotSpot(TM) Client VM (build 20.6-b01, mixed mode, sharing) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 23:09:01 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
А ещё можно узнать, зачем копировать огромный текст в коллекцию? Я бы уже копался, пытаясь узнать, как считать текстовый файл с последней строки до первой. Тогда и не надо большие объемы памяти. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 23:12:40 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
ozzmosis, Как вариант, создайте локальную БД (типа SQLite) с одной таблицей и загоняйте туда последовательно все слова (вместо ArrayList'а)... из БД доставайте при помощи запроса "SELECT ... ORDER BY ID DESC" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 23:19:27 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
LeonidvПодключите профайлер (visualvm, например) и через него смотрите, что происходит.Просветите неуча: вот запустил я его, дальше запустил java myapp - и как его профилировать ? он (myapp) появляется на доли секунды в левой панели ("дереве" приложений) и тут же исчезает :/ Здесь читал, но там он "запустил фоном DaCapo:lusearch" - т.е. это приложение у него постоянно торчит в списке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 23:27:13 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
Паша01А ещё можно узнать, зачем копировать огромный текст в коллекцию? Я бы уже копался, пытаясь узнать, как считать текстовый файл с последней строки до первой. Тогда и не надо большие объемы памяти.ну так мне в конечном счете это и надо: прочитать текст "от обратного". Только я нигде не видел такого, чтобы файл "задом наперёд" читать можно было :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 23:30:26 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
ozzmosisТолько я нигде не видел такого, чтобы файл "задом наперёд" читать можно было :-) Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 23:32:10 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
Usmanozzmosis, Как вариант, создайте локальную БД (типа SQLite) с одной таблицей и загоняйте туда последовательно все слова (вместо ArrayList'а)... из БД доставайте при помощи запроса "SELECT ... ORDER BY ID DESC"Спасибо, попробую. Но не с SQLite'ом, а с другой базой. Только есть смутное терзание, что по времени тоскливо станет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2013, 23:32:35 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
Usman Код: java 1. 2. 3. 4. 5. 6. 7. 8. теперь с расходом памяти всё пучком (16 мегов), но время выполнения стало тихим кошмаром: 42 сек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2013, 00:19:11 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
ozzmosis, Должен быть выигрыш в несколько секунд: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2013, 04:51:28 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2013, 08:42:17 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
ozzmosis, Все приведенные варианты решения так или иначе связаны с расширением массива символов, что затратно. Уж хотя бы StringBuilder'у сразу задайте размер побольше. Или просто загнать весь файл в структуру char[]? А потом пройтись обычным циклом по всем элементам с нахождением слов. Тогда расход памяти не должен превышать размер входного файла, а проход по 8М байтов в памяти - сущий пустяк. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2013, 09:29:21 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
По-моему, напрашивается Memory Mapped file - совершенно необязательно весь файл зачитывать в память, достаточно отобразить его в память, и зачитывать оттуда небольшие кусочки, начиная с хвоста. Как-то так: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2013, 09:52:02 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
WGAИли просто загнать весь файл в структуру char[]? Да вообще лучше без этого, а если файл под 1 Гб. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2013, 10:19:35 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
ivanraзачитывать оттуда небольшие кусочки не вариант, можно слова порезать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2013, 10:32:50 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
ozzmosis Код: plaintext 1. 2. хотя леонидв намекнул об етом ссылкой ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2013, 10:37:09 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
ozzmosis, хранить в списке нужно не слова, а целочисленные смещения курсора относительно начала файла, тогда потребуется обычный целый массив: читаем словечко, запоминаем смещение и тд и тп. ну и потом в обратном порядке проходим массив, позиционируем курсор и читаем до следующей позиции, как то-так Зачем что-то кэшировать? Роль буфера вполне выполнит уже имеющийся файл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2013, 10:43:27 |
|
||
|
Парсинг .txt-файла размером 8Мб (разбивка на слова): жрёт ~120 Мб памяти
|
|||
|---|---|---|---|
|
#18+
ozzmosisВсем привет. Есть текст среднего размера, его надо разбить на слова и вывести затем эти слова в обратном порядке в новый файл. То есть, для входного файла с таким содержимым: Код: java 1. 2. 3. 4. 5. 6. 7. - надо получить на выходе: Код: java 1. 2. 3. 4. 5. 6. 7. Исходный файл небольшой: размер около 8 Мегов, содержит 149 тыс слов (язык - английский). Полазив в интернетах, сделал следующий класс: Код: 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. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. Однако расход памяти в пиковый момент достигает 117 мегов (для всего 8 мегов исходного текста). Покритикуйте, плз, код: я вообще в ту степь полез или надо медитировать над другими способами ? Как уменьшить расход памяти ? Сам текстовый файл тут: http://yadi.sk/d/5UsjXzJ-3VcUs] http://yadi.sk/d/5UsjXzJ-3VcUs Заранее спасибо за ответы. такто вощето надо 1. вместо list использовать Stack 2. в него класть строки, прочитанные из файла, без всяких сплитов 3. потом делать stack.pop().split() 4. и в обратном порядке писать етот массив в файл скорость скорее всего не увеличится используемая память уменьшится раза в два так наверняка пасмари если не лень ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.03.2013, 11:48:03 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38196654&tid=2129641]: |
0ms |
get settings: |
17ms |
get forum list: |
22ms |
check forum access: |
6ms |
check topic access: |
6ms |
track hit: |
50ms |
get topic data: |
13ms |
get forum data: |
4ms |
get page messages: |
71ms |
get tp. blocked users: |
2ms |
| others: | 300ms |
| total: | 491ms |

| 0 / 0 |
