powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
29 сообщений из 29, показаны все 2 страниц
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230301
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.

Дано:
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.
import java.io.*;
public class MemoConsumptionExplore1 {
    public static void main(String[] args) throws IOException {
        new MemoConsumptionExplore1().run();
    }
    void run() throws IOException {
        String file = "c:\\java_test_int_1e7.txt";
        BufferedReader fr=new BufferedReader(new FileReader(file));
        String s;
        while ( fr.ready() ) {
            s = fr.readLine();
        }
    }
}



Профайлинг этого класса показывает, что used heap превышал 5 мегов, а для размещения 10 млн char[]-объектов потребовалось более 42 Мб (см аттач).
Объясните, плз: он что, для каждой прочитанной строки создаёт новый char[] ? Откуда эти сумасшедшие цифры взялись, чтобы прочесть всего 10 млн строк, причём в одну и ту же переменную ?...
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230315
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
String - immutable тип. Каждая новая строка это новый объект памяти. При чем тут вообще переменная? Переменная это лишь ссылка на объект. Поэтому текст нужно обрабатывать поточно это раз. Если файл это не текст, а числа, то и вычитывать его лучше как числа, это два.
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230338
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczString - immutable тип. Каждая новая строка это новый объект памяти. При чем тут вообще переменная? Переменная это лишь ссылка на объект. Поэтому текст нужно обрабатывать поточно это раз. Если файл это не текст, а числа, то и вычитывать его лучше как числа, это два.Про immutable - спасибо, понял.
Только не ясно, как вообще заставить его поменьше обжорствовать.
Если так:
Код: java
1.
2.
3.
4.
5.
6.
...
        StringBuilder b;
        while ( fr.ready() ) {
            b = new StringBuilder(fr.readLine());
        }
        ...

- то еще хуже, 118 Мб.
Как правильно делать ?
И еще: "текст нужно обрабатывать поточно " - что это даст, меньше памяти будет жрать ?
(в файле могут быть не только int-числа, это всего лишь для примера)
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230344
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosisТолько не ясно, как вообще заставить его поменьше обжорствовать.

Не понятна постановка задачи. Вычитать 10млн строк в память? Ну, вы это и получили. Больше ничего этот код не делает.
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230352
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, ozzmosis!

> Профайлинг этого класса показывает, что used heap превышал 5 мегов, а
> для размещения 10 млн char[]-объектов потребовалось более 42 Мб (см аттач).
> Объясните, плз: он что, для каждой прочитанной строки создаёт новый
> char[] ? Откуда эти сумасшедшие цифры взялись, чтобы прочесть всего 10
> млн строк, причём в одну и ту же переменную ?...

А в чём вообще проблема?

JVM дали памяти. Она ей распоряжается как хочет. Если места много-
сборка мусора откладывается. Надо будет- вернётся всё на место.

Можно попробовать поставить -xMx=32m или что-нибудь в этом роде, и
посмотреть.

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230356
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosis,

fr.readLine() не используйте вообще.
Используйте fr.read(buffer...)
где buffer это char[], тогда у вас не будет каждый раз создаваться строка, а будет каждый раз наполнятся один и тот же массив.

Если вы что-то парсите, то не понятно, почему не взять готовые библиотеки.
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230357
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczozzmosisТолько не ясно, как вообще заставить его поменьше обжорствовать.

Не понятна постановка задачи. Вычитать 10млн строк в память? Ну, вы это и получили. Больше ничего этот код не делает.Дык я специально упростил всё. Конечно же, дальше я что-то буду делать с каждой из прочитанных строк. Например, если она состоит из строго двух слов, то добавлю в предв. созданный HashMap, если из одного в - HashSet, если из трёх и более - в игнор её, и т.д.
Я просто пока хочу понять, как сделать "вычитку" файла с минимальными затратами по памяти (файл, есс-но, гораздо больше, чем эти 10 млн строк).
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230365
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosisДык я специально упростил всё. Конечно же, дальше я что-то буду делать с каждой из прочитанных строк. Например, если она состоит из строго двух слов, то добавлю в предв. созданный HashMap, если из одного в - HashSet, если из трёх и более - в игнор её, и т.д.
Я просто пока хочу понять, как сделать "вычитку" файла с минимальными затратами по памяти (файл, есс-но, гораздо больше, чем эти 10 млн строк).
Сведите использование String к минимуму.
Читайте через переиспользуемый char[] буфер.
Местами String можно заменить на CharSequence.
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230368
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz fr.readLine() не используйте вообще.
Используйте fr.read(buffer...)
где buffer это char[], тогда у вас не будет каждый раз создаваться строка, а будет каждый раз наполнятся один и тот же массив.

Если вы что-то парсите, то не понятно, почему не взять готовые библиотеки.Ясно, спасибо вам еще раз.

Да, и еще вопрос, в догонку.
Есть у мну переменная b1 типа BigInteger.
Есть файл, все строки которого - только числа, но весьма большие.
Как внутри цикла присваивать переменной b1 очередное прочитанное число, но чтобы не создавать строку с передачей конструктору BigInteger(String val) ?
В конструкторах BigInteger нету такого, которому аргументом можно передать char[]. Там есть BigInteger(byte[] val), но я не въехал, что ему надо подсовывать. Двоичное представление прочитанного числа ? Ну так я еще не знаю его Bigint-значения.
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230382
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати, сразу бросается в глаза StringBuffer на 4 месте. Хотя мог бы быть StringBuilder. Эх, не экономят время процессора при чтении файла
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230424
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanraКстати, сразу бросается в глаза StringBuffer на 4 месте. Хотя мог бы быть StringBuilder. Эх, не экономят время процессора при чтении файла
В Java 7 особой разницы уже нет. Если StringBuffer использутеся одним потоком, затраты на synchronized не значительны.
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230445
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosisЕсть у мну переменная b1 типа BigInteger.
Есть файл, все строки которого - только числа, но весьма большие.
Как внутри цикла присваивать переменной b1 очередное прочитанное число, но чтобы не создавать строку с передачей конструктору BigInteger(String val) ?
В конструкторах BigInteger нету такого, которому аргументом можно передать char[]. Там есть BigInteger(byte[] val), но я не въехал, что ему надо подсовывать. Двоичное представление прочитанного числа ? Ну так я еще не знаю его Bigint-значения.
Здесь уже надо пробовать и смотреть. BigInteger API что-то не проапдейтили для этих целей. Сначала попробуйте создавать String непосредственно из char[] полного числа. И посмотреть на сколько это приемлемое для вас решение. Если нет, тогда уже можно искать обходные пути.
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230480
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день, Blazkowicz!

> Здесь уже надо пробовать и смотреть. BigInteger API что-то не
> проапдейтили для этих целей.

Как это? Там конструктор есть
public BigDecimal(char[] in, int offset, int len)

Дочитать его до конца у меня сил не хватило :) но вроде как строк не
создаётся.

--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230483
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GKS_SamaraКак это? Там конструктор есть
public BigDecimal(char[] in, int offset, int len)

В BigInteger - нет.
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230486
GKS_Samara
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

>> Здесь уже надо пробовать и смотреть. BigInteger API что-то не
>> проапдейтили для этих целей.
>
> Как это? Там конструктор есть
> public BigDecimal(char[] in, int offset, int len)
>
> Дочитать его до конца у меня сил не хватило :) но вроде как строк не
> создаётся.

Блин, не заметил- это ж BigDecimal. У BigInteger такой конструктор
уровня пакета.


--
Алексей
JID: alxt@ya.ru
Posted
via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230488
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GKS_SamaraБлин, не заметил- это ж BigDecimal. У BigInteger такой конструктор
уровня пакета.

Но топикастеру стоит попробовать BigDecimal, как вариант. Возможно разницы с BigInteger особой не будет.
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230798
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosisЕсли так:
Код: java
1.
2.
3.
4.
5.
6.
...
        StringBuilder b;
        while ( fr.ready() ) {
            b = new StringBuilder(fr.readLine());
        }
        ...

- то еще хуже, 118 Мб.
Как правильно делать ?

А зачем вы создаете каждый раз при чтении строки новый StringBuilder? Почему не как-то так?
Код: java
1.
2.
3.
4.
5.
6.
        StringBuilder b;
        b = new StringBuilder(1000000); //1000000 для примера, можно прикинуть, сколько выделить, 
       //чтобы меньше потом перевыделять память
        while ( fr.ready() ) {
            b.append(fr.readLine());
        }


(С Java не особо знаком, может я чего-то не понял).
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230807
s62
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, понял кажется, это у вас просто тест, просто считываете отдельно каждую строку.
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38230818
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

спасибо за ответы. Буду пробовать.
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38231364
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Нет, не могу осилить что-то этот самый "потоковый ввод".

Вот есть код, генерящий (для примера) 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.
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class FileReaderTest {
    StreamTokenizer in;
    BufferedWriter bw;
    final String FILE_NAME="c:\\bigints.txt";
    public static void main(String[] args) throws IOException {
        new FileReaderTest().run();
    }
    void run() throws IOException {
        bw = new BufferedWriter(new FileWriter(FILE_NAME));
        int N = 10; // 000;
        BigInteger b;
        Random r = new Random();
        for (int i = 0; i < N; i++) {
           b = new BigInteger(128, r);
           bw.write(b.toString());
           bw.newLine();
        }
        bw.close();        
        //---------------------------------------------------------------------
        in = new StreamTokenizer(new BufferedReader(new FileReader(FILE_NAME))); 
        
        HashSet<BigInteger> hsPrimes = new HashSet<BigInteger>();
        int i=0;
        BigInteger p;
        while (in.nextToken() != StreamTokenizer.TT_EOF) {
            // ? how to cast next token as String ?
            //p.isProbablePrime(4);
            i++;
        }
        System.out.println("total primes in list: "+i);
    }
} // end of class FileReaderTest



ВОПРОС. Как заставить StreamTokenizer при чтении ЧИСЛА (127776541237890123 etc - явно большего, чем MAX_INT) воспринять прочитанное как СТРОКУ, чтобы на основе её создать новый BigInt-объект ? ПоможЫте, плз :-/
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38231401
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
всё время читать как строку tokenizer.sval
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38231409
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczвсё время читать как строку tokenizer.svalДык! Пробовал, разумеется.
Вот:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
...
        while (in.nextToken() != StreamTokenizer.TT_EOF) {
            // ? how to cast next token as String ?
            String s = in.sval;
            System.out.println("s="+s);
            p=new BigInteger(s);
            //p.isProbablePrime(4);
            i++;
        }

Результат:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
run:
s= null  
Exception in thread "main" java.lang. NullPointerException
	at java.math.BigInteger.<init>(BigInteger.java:271)
	at java.math.BigInteger.<init>(BigInteger.java:451)
	at DataStructures.FileReaderTest.run(FileReaderTest.java:33)
	at DataStructures.FileReaderTest.main(FileReaderTest.java:10)
Java Result: 1
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38231426
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ozzmosis,

Код: java
1.
2.
3.
if(s == null){
  continue;
}
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38231443
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczozzmosis,

Код: java
1.
2.
3.
if(s == null){
  continue;
}


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
        int i=0;
        BigInteger p;
        while (in.nextToken() != StreamTokenizer.TT_EOF) {
            // ? how to cast next token as String ?
            String s = in.sval;
            if (s==null) {
                continue;
            }
            System.out.println("s="+s);
            p=new BigInteger(s);
            //p.isProbablePrime(4);
            i++;
        }
        System.out.println("total primes in list: "+i);



Однако:
Код: plaintext
1.
2.
run:
total primes in list: 0
BUILD SUCCESSFUL (total time: 0 seconds)

То есть, он (in.sval) вообще ни одно из BigInteger -чисел не обработал, всё воспринял как null.
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38231640
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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.
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class FileReaderTest {
    StreamTokenizer in;
    BufferedWriter bw;
    final String FILE_NAME="c:\\bigints.txt";
    public static void main(String[] args) throws IOException {
        new FileReaderTest().run();
    }
    void run() throws IOException {
        bw = new BufferedWriter(new FileWriter(FILE_NAME));
        int N = 1000;
        BigInteger b;
        Random r = new Random();
        for (int i = 0; i < N; i++) {
           b = new BigInteger(164, r);
           bw.write(b.toString());
           bw.newLine();
        }
        bw.close();        
        //---------------------------------------------------------------------
        in = new StreamTokenizer(new BufferedReader(new FileReader(FILE_NAME))); 

        // commands to handle result of in.sval always as String 
        // during read of large integer numbers:
        in.resetSyntax();
        in.wordChars('0', '9');
        in.whitespaceChars('\r', '\r');
        in.whitespaceChars('\n', '\n');
        
        TreeSet<BigInteger> hsPrimes = new TreeSet<BigInteger>();
        int i=0;
        BigInteger p;
        while (in.nextToken() != StreamTokenizer.TT_EOF) {
            String s = in.sval;
            p=new BigInteger(s);
            if (p.isProbablePrime(4)) {
                hsPrimes.add(p);
                i++;
            }
        }
        
        for( BigInteger hsx : hsPrimes ) {
            System.out.println(hsx);
        }
        System.out.println("\nTotal primes in list: "+i);
    }
} // end of class FileReaderTest


Пример результата:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
run:
4612619974923713006482770328350670622019371639077
7189510052098150038091299601582044773577185859157
8407730875700650704020123844924590906417514732821
8867142705835293079085585841666931214505993454957
10354240823379391054805894162827628843337663603409
17142209726205277927415048885733089334431596809097
22323063444758797701968114793566179667817460514761
23159319033082054596615693780239344377534899380351

Total primes in list: 8
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38231708
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczozzmosis,

fr.readLine() не используйте вообще.
Используйте fr.read(buffer...)
где buffer это char[], тогда у вас не будет каждый раз создаваться строка, а будет каждый раз наполнятся один и тот же массив.

Если вы что-то парсите, то не понятно, почему не взять готовые библиотеки.Теперь осталось понять, как юзать BufferedReader вкупе с char[], чтобы читать строки, разделенные символами перевода строки, каждый раз в один и тот же char[].
Но поскольку у мну обработка больших чисел, надо этот chr[]-массив после считывания в него символов как-то обработать, чтобы его смог съесть конструктор BigDecimal.

Код: java
1.
2.
3.
4.
5.
        br = new BufferedReader(new FileReader(FILE_NAME));
        char[] buf = new char[60]; // 60 = гарантированно больше, чем число десятичных знаков в сгенерённых BigInt-числах
        while (br.ready()) {
            // br.read(buf, off, len); // вот тут - что надо делать ?
        }


Что следует делать / вызвать там, внутри цикла ? Он же считывает каждый байт, в том числе переводы строк.
Надо как-то "эмулировать" readline(), чтобы при чтении ограничивался каждый раз символом CR/LF.
Попробовал велосипед сделать, получилась неработающая туфта:
Код: 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.
        br = new BufferedReader(new FileReader(FILE_NAME));
        char[] buf = new char[60];
        int k=0;
        List clist;
        //System.out.println(br.markSupported());
        BigDecimal d;
        while (br.ready() && k<10) {
            br.mark(60);
            br.read(buf, 0, 60);
            int crlf=0;
            for (int j = 0; j < buf.length; j++) {
                if (buf[j]=='\r') {
                    crlf=j;
                }
                if (j>=crlf-1) {
                    buf[j]=' ';
                }
            }
            br.reset();
            br.read(buf, 0, crlf);
            System.out.println((new String(buf)));
            d=new BigDecimal(buf);
            k++;
        }

Результат:
run:
Код: plaintext
1.
2.
3.
4.
5.
6.
100004163706653319627008032022914325716                     
Exception in thread "main" java.lang.NumberFormatException
	at java.math.BigDecimal.<init>(BigDecimal.java:459)
	at java.math.BigDecimal.<init>(BigDecimal.java:590)
	at DataStructures.ChkBigPrimes2.run(ChkBigPrimes2.java:48)
	at DataStructures.ChkBigPrimes2.main(ChkBigPrimes2.java:11)
Java Result: 1

Обламывается, видимо, на том, что в buf[] после цифр идут пробелы.
Велосипед изобретать глупо. Подскажите, плз - есть какие-то готовые решения для этого ?
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38231901
ozzmosis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ozzmosisBlazkowiczozzmosis,

fr.readLine() не используйте вообще.
Используйте fr.read(buffer...)
где buffer это char[], тогда у вас не будет каждый раз создаваться строка, а будет каждый раз наполнятся один и тот же массив.

Если вы что-то парсите, то не понятно, почему не взять готовые библиотеки.Обламывается, видимо, на том, что в buf[] после цифр идут пробелы.
Велосипед изобретать глупо. Подскажите, плз - есть какие-то готовые решения для этого ?Ошибку победил, но судя по всему -коряво вышло :(
Нету выигрыша (я всё про объем памяти в профайлере).
Итак, два варианта чтения файла с BigInteger-числами, определения их простоты и укладывания по возрастанию в TreeSet (чтобы долго не ждать, ограничил чтение первыми 100 тыс сроками):
1. via StringTokenizer:
Код: 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.
import java.io.*;
import java.math.*;
import java.util.*;
// reading file with BigInts via StreamTokenizer + String handling
public class ChkBigPrimes {
    StreamTokenizer in;

    final String FILE_NAME="c:\\bigints.txt";
    final int MAX_LIMIT = 100000;
    public static void main(String[] args) throws IOException {
        new ChkBigPrimes().run();
    }
    void run() throws IOException {
        in = new StreamTokenizer(new BufferedReader(new FileReader(FILE_NAME))); 

        // commands to handle result of in.sval always as String 
        // during read of large integer numbers:
        in.resetSyntax();
        in.wordChars('0', '9');
        in.whitespaceChars('\r', '\r');
        in.whitespaceChars('\n', '\n');
        
        TreeSet<BigInteger> hsPrimes = new TreeSet<BigInteger>();
        BigInteger p;
        int i=0;
        while (in.nextToken() != StreamTokenizer.TT_EOF && i<MAX_LIMIT) {
            //p=new BigInteger(in.sval);
            p=new BigDecimal( (in.sval).toCharArray() ).toBigInteger();
            if (p.isProbablePrime(4)) {
                hsPrimes.add(p);
            }
            i++;
        }
        System.out.println("\nTotal primes in list: "+hsPrimes.size());
    }
} // end of class ChkBigPrimes


2. via BufferedReader + char[] + char[]: // да, ДВА char[]-массива
Код: 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.
import java.io.*;
import java.math.*;
import java.util.*;
// reading file with BigInts via BufferedReader + two char[] arrays
public class ChkBigPrimes2 {
    StreamTokenizer in;
    BufferedReader br;
    final String FILE_NAME="c:\\bigints.txt";
    final int CRLF_LENGTH=2;
    final int MAX_LIMIT = 100000;
    public static void main(String[] args) throws IOException {
        new ChkBigPrimes2().run();
    }
    void run() throws IOException {
        TreeSet<BigInteger> hsPrimes = new TreeSet<BigInteger>();
        br = new BufferedReader(new FileReader(FILE_NAME));
        char[] buf = new char[60];
        BigInteger p;
        int i=0;
        while (br.ready() && i<MAX_LIMIT) {
            br.mark(60);
            br.read(buf, 0, 60);
            int crlf_idx=0;
            for (int j = 0; j < buf.length; j++) {
                if (buf[j]=='\r') {
                    crlf_idx = j;
                }
            }

            char[] buf2 = new char[crlf_idx]; // пришлось создать второй char[],
            System.arraycopy(buf, 0, buf2, 0, crlf_idx); // т.к. не знаю, как по-другому вырезать из 1-го char[] часть его.

            br.reset();
            br.read(buf, 0, crlf_idx + CRLF_LENGTH);
            p=new BigDecimal(buf2).toBigInteger();
            if (p.isProbablePrime(4)) {
                hsPrimes.add(p);
            }
            i++;
        }
        br.close();
        System.out.println("\nTotal primes in list: "+hsPrimes.size());
    }
} // end of class ChkBigPrimes2



Оба варианта работают одинаково: на моей машине 14 сек.
И потребление памяти в обоих вариантах одинаковое - см скриншот.

И где тогда профит при отказе от readLine() ?
...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38237495
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сколько этот?
LoadBigInteger
Код: 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.
package loadbiginteger;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.HashSet;
import java.util.Set;

public class LoadBigInteger {

    private static final String PATH = "C:\\Documents and Settings\\User\\Рабочий стол\\BigInts.txt";

    public static void main(String[] args) throws IOException {
        Set<BigInteger> hsPrimes = new HashSet<>();
        Reader in = new BufferedReader(new FileReader(PATH));
        char[] buffer = new char[1024 * 1024];

        int ch, position;
        do {
            position = 0;
            while (Character.isDigit(ch = in.read()) || ch == '-' || ch == '+') {
                buffer[position++] = (char) ch;
            }

            if (position > 0) {
                try {
                    BigInteger p = new BigDecimal(buffer, 0, position).toBigInteger();
//                    if (p.isProbablePrime(4)) { //эта функция работает основное время, имеет смысл распараллелить вычисление probablePrimes
                        hsPrimes.add(p);
//                    }
                } catch (Exception e) {
                    System.out.println(e.getLocalizedMessage());
                }
            }
        } while (ch != -1);
        //разумеется ресурсы надо закрыть если программа ещё долго будет работать
        System.out.println("Total primes in list: " + hsPrimes.size());
    }
}


...
Рейтинг: 0 / 0
Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
    #38237510
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У этого файла такое жесткое форматирование что его можно считать двоичным типизированным.
Можно читать блоками по 14 CHARS и будет ОК. И диапазон long не превышает. Тут даже BitIneger
не нужно использовать.

Код: 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.
  1456996351
    58097664
   612630528
  1806270463
  1441398783
   491913216
  1446281215
  1231060991
  1776058367
  1763049471
   172097536
  1259208703
   235241472
  1604517887
   718635008
   853934080
   640548864
   783843328
  1944715263
    18546688
  2064646143
  1448280063
   863174656
  2048589823
   749404160
  1920303103
   122290176
  1490583551
  1931673599
  1216839679
  1068531712
  1655701503
   566132736
  1584562175
  2069364735
   236290048
   562397184
   562135040
  1354858495
  1322745855
  1684996095
...
Рейтинг: 0 / 0
29 сообщений из 29, показаны все 2 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Чтение 10 млн коротких строк (int-чисел) из файла. Как понять результаты профайлинга ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]