|
|
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте. Дано: 1) файл с 10 млн строками, в каждой - int-число; скачать его можно тут: http://ge.tt/5LUt8Oe/v/0 2) класс с единственной String-переменной, считывающий в неё каждую строку этого файла: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Профайлинг этого класса показывает, что used heap превышал 5 мегов, а для размещения 10 млн char[]-объектов потребовалось более 42 Мб (см аттач). Объясните, плз: он что, для каждой прочитанной строки создаёт новый char[] ? Откуда эти сумасшедшие цифры взялись, чтобы прочесть всего 10 млн строк, причём в одну и ту же переменную ?... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 10:00:19 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
String - immutable тип. Каждая новая строка это новый объект памяти. При чем тут вообще переменная? Переменная это лишь ссылка на объект. Поэтому текст нужно обрабатывать поточно это раз. Если файл это не текст, а числа, то и вычитывать его лучше как числа, это два. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 10:07:11 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczString - immutable тип. Каждая новая строка это новый объект памяти. При чем тут вообще переменная? Переменная это лишь ссылка на объект. Поэтому текст нужно обрабатывать поточно это раз. Если файл это не текст, а числа, то и вычитывать его лучше как числа, это два.Про immutable - спасибо, понял. Только не ясно, как вообще заставить его поменьше обжорствовать. Если так: Код: java 1. 2. 3. 4. 5. 6. - то еще хуже, 118 Мб. Как правильно делать ? И еще: "текст нужно обрабатывать поточно " - что это даст, меньше памяти будет жрать ? (в файле могут быть не только int-числа, это всего лишь для примера) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 10:22:34 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
ozzmosisТолько не ясно, как вообще заставить его поменьше обжорствовать. Не понятна постановка задачи. Вычитать 10млн строк в память? Ну, вы это и получили. Больше ничего этот код не делает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 10:26:37 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
Добрый день, ozzmosis! > Профайлинг этого класса показывает, что used heap превышал 5 мегов, а > для размещения 10 млн char[]-объектов потребовалось более 42 Мб (см аттач). > Объясните, плз: он что, для каждой прочитанной строки создаёт новый > char[] ? Откуда эти сумасшедшие цифры взялись, чтобы прочесть всего 10 > млн строк, причём в одну и ту же переменную ?... А в чём вообще проблема? JVM дали памяти. Она ей распоряжается как хочет. Если места много- сборка мусора откладывается. Надо будет- вернётся всё на место. Можно попробовать поставить -xMx=32m или что-нибудь в этом роде, и посмотреть. -- Алексей JID: alxt@ya.ru Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 10:29:20 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
ozzmosis, fr.readLine() не используйте вообще. Используйте fr.read(buffer...) где buffer это char[], тогда у вас не будет каждый раз создаваться строка, а будет каждый раз наполнятся один и тот же массив. Если вы что-то парсите, то не понятно, почему не взять готовые библиотеки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 10:32:01 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczozzmosisТолько не ясно, как вообще заставить его поменьше обжорствовать. Не понятна постановка задачи. Вычитать 10млн строк в память? Ну, вы это и получили. Больше ничего этот код не делает.Дык я специально упростил всё. Конечно же, дальше я что-то буду делать с каждой из прочитанных строк. Например, если она состоит из строго двух слов, то добавлю в предв. созданный HashMap, если из одного в - HashSet, если из трёх и более - в игнор её, и т.д. Я просто пока хочу понять, как сделать "вычитку" файла с минимальными затратами по памяти (файл, есс-но, гораздо больше, чем эти 10 млн строк). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 10:32:24 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
ozzmosisДык я специально упростил всё. Конечно же, дальше я что-то буду делать с каждой из прочитанных строк. Например, если она состоит из строго двух слов, то добавлю в предв. созданный HashMap, если из одного в - HashSet, если из трёх и более - в игнор её, и т.д. Я просто пока хочу понять, как сделать "вычитку" файла с минимальными затратами по памяти (файл, есс-но, гораздо больше, чем эти 10 млн строк). Сведите использование String к минимуму. Читайте через переиспользуемый char[] буфер. Местами String можно заменить на CharSequence. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 10:37:14 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz fr.readLine() не используйте вообще. Используйте fr.read(buffer...) где buffer это char[], тогда у вас не будет каждый раз создаваться строка, а будет каждый раз наполнятся один и тот же массив. Если вы что-то парсите, то не понятно, почему не взять готовые библиотеки.Ясно, спасибо вам еще раз. Да, и еще вопрос, в догонку. Есть у мну переменная b1 типа BigInteger. Есть файл, все строки которого - только числа, но весьма большие. Как внутри цикла присваивать переменной b1 очередное прочитанное число, но чтобы не создавать строку с передачей конструктору BigInteger(String val) ? В конструкторах BigInteger нету такого, которому аргументом можно передать char[]. Там есть BigInteger(byte[] val), но я не въехал, что ему надо подсовывать. Двоичное представление прочитанного числа ? Ну так я еще не знаю его Bigint-значения. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 10:38:28 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
Кстати, сразу бросается в глаза StringBuffer на 4 месте. Хотя мог бы быть StringBuilder. Эх, не экономят время процессора при чтении файла ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 10:44:27 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
ivanraКстати, сразу бросается в глаза StringBuffer на 4 месте. Хотя мог бы быть StringBuilder. Эх, не экономят время процессора при чтении файла В Java 7 особой разницы уже нет. Если StringBuffer использутеся одним потоком, затраты на synchronized не значительны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 11:02:35 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
ozzmosisЕсть у мну переменная b1 типа BigInteger. Есть файл, все строки которого - только числа, но весьма большие. Как внутри цикла присваивать переменной b1 очередное прочитанное число, но чтобы не создавать строку с передачей конструктору BigInteger(String val) ? В конструкторах BigInteger нету такого, которому аргументом можно передать char[]. Там есть BigInteger(byte[] val), но я не въехал, что ему надо подсовывать. Двоичное представление прочитанного числа ? Ну так я еще не знаю его Bigint-значения. Здесь уже надо пробовать и смотреть. BigInteger API что-то не проапдейтили для этих целей. Сначала попробуйте создавать String непосредственно из char[] полного числа. И посмотреть на сколько это приемлемое для вас решение. Если нет, тогда уже можно искать обходные пути. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 11:10:04 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
Добрый день, Blazkowicz! > Здесь уже надо пробовать и смотреть. BigInteger API что-то не > проапдейтили для этих целей. Как это? Там конструктор есть public BigDecimal(char[] in, int offset, int len) Дочитать его до конца у меня сил не хватило :) но вроде как строк не создаётся. -- Алексей JID: alxt@ya.ru Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 11:24:00 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
GKS_SamaraКак это? Там конструктор есть public BigDecimal(char[] in, int offset, int len) В BigInteger - нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 11:25:16 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
Добрый день! >> Здесь уже надо пробовать и смотреть. BigInteger API что-то не >> проапдейтили для этих целей. > > Как это? Там конструктор есть > public BigDecimal(char[] in, int offset, int len) > > Дочитать его до конца у меня сил не хватило :) но вроде как строк не > создаётся. Блин, не заметил- это ж BigDecimal. У BigInteger такой конструктор уровня пакета. -- Алексей JID: alxt@ya.ru Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 11:25:46 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
GKS_SamaraБлин, не заметил- это ж BigDecimal. У BigInteger такой конструктор уровня пакета. Но топикастеру стоит попробовать BigDecimal, как вариант. Возможно разницы с BigInteger особой не будет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 11:27:14 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
ozzmosisЕсли так: Код: java 1. 2. 3. 4. 5. 6. - то еще хуже, 118 Мб. Как правильно делать ? А зачем вы создаете каждый раз при чтении строки новый StringBuilder? Почему не как-то так? Код: java 1. 2. 3. 4. 5. 6. (С Java не особо знаком, может я чего-то не понял). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 13:24:56 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
А, понял кажется, это у вас просто тест, просто считываете отдельно каждую строку. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 13:31:36 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, спасибо за ответы. Буду пробовать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 13:39:39 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
Нет, не могу осилить что-то этот самый "потоковый ввод". Вот есть код, генерящий (для примера) 10 bigint-чисел и записывающий их в файл. Затем этот файл считывается и для каждого числа надо определить, простое оно или нет (с некоторой вероятностью). Далее сложить только простые числа в HashSet и вывести общее их кол-во: Код: 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. ВОПРОС. Как заставить StreamTokenizer при чтении ЧИСЛА (127776541237890123 etc - явно большего, чем MAX_INT) воспринять прочитанное как СТРОКУ, чтобы на основе её создать новый BigInt-объект ? ПоможЫте, плз :-/ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 17:24:15 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
всё время читать как строку tokenizer.sval ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 17:36:41 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczвсё время читать как строку tokenizer.svalДык! Пробовал, разумеется. Вот: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. Результат: Код: plaintext 1. 2. 3. 4. 5. 6. 7. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 17:40:09 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
ozzmosis, Код: java 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 17:49:41 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
Blazkowiczozzmosis, Код: java 1. 2. 3. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Однако: Код: plaintext 1. 2. То есть, он (in.sval) вообще ни одно из BigInteger -чисел не обработал, всё воспринял как null. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 18:00:41 |
|
||
|
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
|
|||
|---|---|---|---|
|
#18+
ozzmosisТо есть, он (in.sval) вообще ни одно из BigInteger -чисел не обработал, всё воспринял как null.ффух, нашёл. Ему (объекту StreamTokenizer'a) надо "прочистить мозги", вызвав resetSyntax(), wordChars('0', '9') и whitespaceChars('\r', '\r'). Только тогда он начнёт считываемые числа считать строками, и их можно будет уже подсовывать в конструктор BigInteger'a. Код: 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. Пример результата: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.04.2013, 20:28:25 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38230798&tid=2129484]: |
0ms |
get settings: |
16ms |
get forum list: |
26ms |
check forum access: |
8ms |
check topic access: |
8ms |
track hit: |
65ms |
get topic data: |
24ms |
get forum data: |
6ms |
get page messages: |
124ms |
get tp. blocked users: |
3ms |
| others: | 289ms |
| total: | 569ms |

| 0 / 0 |
