powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Быстрое чтение и разбор файла
158 сообщений из 158, показаны все 7 страниц
Быстрое чтение и разбор файла
    #38562779
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Какой самый быстрый способ чтения файла в java ?

Использовал самый простой построчный подход :
Файл вида : строки разделенные \t табом.

name1\tname2\tname3\tname4\tname5
name6\tname7\tname8\tname9\tname10

....
namen\tnamez\tnamex\tnamek\tnamep


( на файле в 1 млн строк ) BufferedReader - тратит 2 секунды (чисто на чтение )
это очень долго.


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 
LinkedList<ArrayList<String>> list = new LinkedList<ArrayList<String>>();
BufferedReader in = new BufferedReader(new InputStreamReader(NewClass.class.getResourceAsStream("in.txt")));
        String str = null;
        ArrayList<String> rlst = null;
        while ((str = in.readLine()) != null) {
            String arr[] = str.split("\t");
            rlst = new ArrayList<String>(Arrays.asList(arr));
            list.addLast(rlst);
        }
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38562782
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй размер буфера побольше указать. Для больших файлов может помочь.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38562794
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

особой разницы нет , если увеличить буфер в 4 раза - работает медленнее в 2 раза ...

нашел только это : самый быстрый способ чтения в java:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
      RandomAccessFile raf = new RandomAccessFile("test.test", "rw");
        raf.writeInt(145);
        raf.writeUTF(" ");
        raf.writeUTF("afdfjhf");
        raf.writeUTF(" ");
        FileChannel fchan = raf.getChannel();
        System.out.println(fchan.size());
        MappedByteBuffer buf = fchan.map(FileChannel.MapMode.READ_WRITE, 0, fchan.size());



но это не для строк.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38562803
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1 особой разницы нет , если увеличить буфер в 4 раза - работает медленнее в 2 раза ...

И это точно никак не связано с readLine? Т.е. мерял исключительно IO?
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38562971
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1
Файлы состоят из байт, а не строк... Это намёк на то, что можно исключить операцию разбора буфера на строки, заполнять ArrayList<String> по мере парсинга данных, по нахождению символов перевода строки "укладывать" ArrayList в связанный список.

тогда избавитесь от накладок по памяти и времени связанных с двойным проходом по буферу. Т.е. всё должно происходить в один проход...
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563060
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
за сколько времени этот же файл копируется в /dev/null?
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563154
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapokза сколько времени этот же файл копируется в /dev/null?Это зависит от того чем и как копируют...
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563245
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex KuznetsovЭто зависит от того чем и как копируют...Если файл не разреженный и чтение не посимвольное, то все прочие различия сильно нивелируются.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563299
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Делали замеры - по разным языкам , платформам и средам java показывает один из самых плохих результатов :(
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563433
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Делали замеры - по разным языкам , платформам и средам java показывает один из самых плохих результатов :(
Что с одной стороны - не удивительно (все же JRE частично интерпретатор), с другой стороны - при наличие желания , разница в скорости должна быть достаточно не большая и в большей мере лимитироваться скоростью чтения с диска (JIT)

Да и вообще, задача считать много миллионно строковый файл с максимальной скоростью - выглядит немного странно.

Если его нужно считывать все время - нафига? почему такой не удобный формат?
если при загрузки приложения - то +/- пара секунд большого значения иметь не должно
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563493
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Atum1,
Код: java
1.
2.
3.
4.
5.
        while ((str = in.readLine()) != null) {
            String arr[] = str.split("\t");
            rlst = new ArrayList<String>(Arrays.asList(arr));
            list.addLast(rlst);
        }


1000000 строк - 1000000 раз будет создаваться и компилироваться Pattern, скорее всего, можно ускорить разбор, заготовив Pattern заранее. Еще быстрее - искать индекс символа '\t' с помощью метода String.indexOf(ch, fromIndex), чтобы не городить паттерн из-за одного символа.
Ну и с доступом к файлу, меппинг в память (MappedByteBuffer) - правильное направление, это действительно самый быстрый способ, так сказать, буферизация средствами ОС, но со строками придется повозиться
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563499
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил на JDK 7 c nio
Для простоты заменил ArrayList<String> на Bill (простой класс с полями под строку name1\tname2\tname3\tname4\tname5)
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
public class NioReader {

    public static void main(String[] args) throws IOException {
        long time = System.currentTimeMillis();
        ArrayList<Bill> list = new ArrayList<Bill>(1000010);
        BufferedReader rdr = Files.newBufferedReader(Paths.get("in.txt"), Charset.defaultCharset());
        rdr.readLine();
        for (String line; (line = rdr.readLine()) != null;) {
            list.add(new Bill(line));
        }

        long t1 = System.currentTimeMillis() - time;
        System.out.println(" read file " + (t1) + " ms");

        rdr.close();
    }
}


время 2.7 секунды


При переходе на JDK 8 стабильно +1 секунда и время хуже чем в JDK 6 (порядка 3 секунд).
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563587
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если нужна скорость:
1. Если чтение информации многократное, хранить в нормальном формате. Не текстовый, а нормальный двоичный формат
2. Нафиг ООП
3. Нормально профилировать приложение, а не мерить диаметр сферического коня (subj) в вакууме. Куда у Вас уходит время, только Вам и известно: толи ввод/вывод, толи выделение памяти под не нужное ООП, толи GC, толи в LinkedList.
etc...

IMHO & AFAIK

Ради интереса:
1. сколько полей в одной строке файла
2. какой размер файла в байтах
3. какой размер отдельных полей

Только сейчас написал простенький тест на Java. Если не заниматься фигней (типа универсальным преобразованием из любой кодовой таблицы в/из UTF8, ООП и прочее) скорость Java не настолько уж и плохая ))) по крайней мере на моем рабочем компе )))
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563588
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1, в идеальном варианте ты делаешь 2 потока. 1-й читает блоками char[] и пишет в кольцевую память.
2-й поток - конечный автомат (Finite-state_machine) который разбирает эти блоки и генерирует евенты.
Например - 'onBeginBackslashSymbol'. И соотв. принимает какие-то решения.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563591
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mayton, там еще на преобразование charset время уходит дофига. Скорее всего.

А с учетом много-символьных MBCS задача организовать кольцевой буфер будет не сильно простая. Лично я бы упрощал задачу. Нафиг все много-символьные MBCS. IMHO.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563596
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На моем компе только чтение из файла размером 163 Mb:

read binary - 54 ms. (ручками)
read text - 3906 ms. (через java.io.Reader)

При ограничении charset'ов только однобайтовыми наборами, легко можно читать и парсить в несколько потоков. Но при многобайтовых MBCS, задача скорее всего усложнится IMHO & AFAIK. Как минимум нужно книжки читать (я не настолько хорошо знаю принципы организации многобайтовых MBCS) и реализацию Charset и Reader смотреть.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563599
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevMayton, там еще на преобразование charset время уходит дофига. Скорее всего.

Вот это коментарий в точку.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563600
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, потесть пожалуйста utf-8, utf-16, и однобайтовые.
Я думаю что utf-8 должен иметь самый хардкорный char-decoder. Фактически
дезархиватор мать его так.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563609
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема не в хардкордном. А то, что все интерфейсы сделаны универсальными и ООП'ыми.

Соответственно, Charset при декодировании вынужден порождать кучу вспомогательных буферов и отслеживать движение вперед/назад по потоку. IMHO & AFAIK Думаю, разницы в скорости реализации стандартных декодеров Charset большой нет. Даже тестить не охота. Проблема не в конкретном charset, а в _универсальности_ стандартных реализаций.

Если же ОГРАНИЧИВАТЬ исходную задачу, то тогда можно сделать быстрое решение. Если же делать УНИВЕРСАЛЬНОЕ решение, то нефиг на Java поклеп возводить. Плата за универсальность и поддержку кучи Charset.

Но судя по постам автора - а оно на форуме надо? решать дебильную по постановке задачу и заниматься оптимизацией. В принципе, такая работа как оптимизация бизнес-критикал кусков кода IMHO & AFAIK очень дорого стоит.

К тому же, совершенно не понятно. ЗАЧЕМ это нужно. Один раз считать файл при загрузки приложение, что 0.5 сек, что 5 сек - роли большой иметь не должно. Нужна сверх скорость (близкая к ассемблеру) - перерабатывать постановку, делать нормальные форматы хранения данных и на диске и в памяти. Загонять миллионы объектов в LinkedList лично мне Java'у было бы жалко ))) Но я программировать учился на 286 с 1 Mb ОП и там ГИС писал (ГеоИнформационная система), т.ч. уже при словах LinkedList, миллион объектов мне компьютер и процессор жалко становится. Жалостливый я очень ))).
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563627
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сишники хардкодили char как byte. Это в 99% случаев решало проблемы перекодировок. И парсеры
работали с байтами. Но эпоха 1-byte ушла. А Unicode так и не зохватила вселенную. Вот и сидим
на двух стульях. Внутри БД Oracle до сих пор рулит 1251 ибо быстро и нефих.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563669
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСишники хардкодили char как byte. Это в 99% случаев решало проблемы перекодировок. И парсеры
работали с байтами. Но эпоха 1-byte ушла. А Unicode так и не зохватила вселенную. Вот и сидим
на двух стульях. Внутри БД Oracle до сих пор рулит 1251 ибо быстро и нефих.Вот и я о том, нефиг заниматься мазохизмом пытаясь выжать из тройного разбора строк скорость. Хоть все соки выжми - нифига хорошего не выйдет. Проход по файлу и по считанному буферу должен быть всего один. И именно за один проход нужно строить весь список, а не херячить по буферу в поисках строк с помощью ReadLn, затем выпендриваться с вызовом split, наконец всё это зафигачивать в ArrayList и только потом этот ArrayList запендюривать в LinkedList... Файл должен рассматриваться как набор байт с двумя типами разделителей и фсё...
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563701
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня.

Файл миллион строк, 50 колонок, размер 421 Mb

Изначальная автора: от 2 259 до 5 807 ms
Моя реализация - от 13 262 до 14 849 ms

Моя реализация, парсинг плюс перегон в String[] (без построения LinkedList) - 3 444
Моя реализация, чтение файла + конвертация charset + парсинг онли - 1 575
Моя реализация, чтение файла + конвертация charset only - 228 ms

(((

Почему кусок кода построения LinkedList, вставленный без изменения в мой алгоритм, настолько резко начинает тормозит. Мне не понятно. Шаманство.

Код: java
1.
2.
3.
       ArrayList<String> rlst = null;
       rlst = new ArrayList<String>(Arrays.asList(arr));
       list.addLast( rlst );
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563707
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, запускай профилировщик.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563710
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid Kudryavtsevтам еще на преобразование charset время уходит дофига. Скорее всего.
Да не особо.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
700 000 слов (Windows 1251; 14,6Mb)
readBytes : 504.558745ms
readChars : 683.095014ms

700 000 слов (UTF-8; 17,9Mb)
readBytes : 664.528306ms
readChars : 713.824252ms


10 000 000 слов (Windows 1251; 220Mb)
readBytes :  8152.754886ms
readChars : 10974.168491ms

10 000 000 слов (UTF-8; 266Mb)
readBytes :  9415.190546ms
readChars : 10618.989616ms



Генератор
Код: 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.
package textgen;

import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Random;

public class TextGen {

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

    public static void main(String[] args) throws IOException {
        try (Writer writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(PATH_SRC), "Cp1251"))) {
            Random r = new Random();
//            for (int i = 1; i < 2_000_001; ++i) { //450Mb
//            for (int i = 1; i < 1_000_001; ++i) { //220Mb
            for (int i = 1; i < 70_001; ++i) { //14Mb
                for (int j = 0; j < 10; ++j) {
                    writer.write("слово_");
                    writer.write(Integer.toString(i));
                    writer.write('_');
                    for (int k = 7 + r.nextInt(5); k > 0; --k) {
                        writer.write('a' + r.nextInt(25));
                    }
                    writer.write('\t');
                }
                writer.write('\n');
            }
        }
    }
}

ReadFile.java
Код: 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.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
package readfile;

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.util.ArrayList;

import static java.lang.System.*;
import static java.util.Arrays.copyOf;

public class ReadFile {

    /** максимальная длина слова */
    private static final int BUFFER_SIZE = 64_000;
    private static final String
            CHARSET  = "Cp1251",
//            CHARSET  = "UTF-8",
            PATH_SRC = "C:\\Documents and Settings\\User\\Рабочий стол\\src.txt";

    public static void main(String[] args) throws IOException {
//        readBytes();
        readChars();
    }

    private static void readChars() throws IOException {
        long time = nanoTime();

        ArrayList<String> arrayList;
        try (Reader reader = new BufferedReader(new InputStreamReader(new FileInputStream(PATH_SRC), CHARSET))) {
            arrayList = new ArrayList<>(700_000);
//            arrayList = new ArrayList<>(10_000_000);
//            arrayList = new ArrayList<>(20_000_000);
            int position = 0;
            char[] buffer = new char[BUFFER_SIZE];
            for (int readed; (readed = reader.read()) != -1;) {
                if (readed > 32) {
                    buffer[position++] = (char) readed;
                } else if (position > 0) {
                    arrayList.add(new String(buffer, 0, position));
                    position = 0;
                }
            }
        }

        time = nanoTime() - time;
        out.println(arrayList.size() + " слов");
        out.println("readChars : " + time / 1e6 + "ms");
    }

    private static void readBytes() throws IOException {
        long time = nanoTime();

        ArrayList<byte[]> arrayList;
        try (InputStream reader = new BufferedInputStream(new FileInputStream(PATH_SRC))) {
            arrayList = new ArrayList<>(700_000);
//            arrayList = new ArrayList<>(10_000_000);
//            arrayList = new ArrayList<>(20_000_000);
            int position = 0;
            byte[] buffer = new byte[BUFFER_SIZE];
            for (int readed; (readed = reader.read()) != -1;) {
                if (readed > 32) {
                    buffer[position++] = (byte) readed;
                } else if (position > 0) {
                    arrayList.add(copyOf(buffer, position));
                    position = 0;
                }
            }
        }

        time = nanoTime() - time;
        out.println(arrayList.size() + " слов");
        out.println("readBytes : " + time / 1e6 + "ms");
    }
}

...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563718
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevУ меня.

Файл миллион строк, 50 колонок, размер 421 Mb

Изначальная автора: от 2 259 до 5 807 ms
Моя реализация - от 13 262 до 14 849 ms

Моя реализация, парсинг плюс перегон в String[] (без построения LinkedList) - 3 444
Моя реализация, чтение файла + конвертация charset + парсинг онли - 1 575
Моя реализация, чтение файла + конвертация charset only - 228 ms

(((

Почему кусок кода построения LinkedList, вставленный без изменения в мой алгоритм, настолько резко начинает тормозит. Мне не понятно. Шаманство.

Код: java
1.
2.
3.
       ArrayList<String> rlst = null;
       rlst = new ArrayList<String>(Arrays.asList(arr));
       list.addLast( rlst );



На этом месте у меня так же наблюдается сильное падение - фактически 50% от общего времени !
Первое что приходит - большие накладные расходы - на ArrayList - и LinkedList

пытался их оптимизировать - ставя размеры итд ...

видимо нужно отказываться от такого формата . переходить на простые массивы или читать
как описали -в буфер а уже его парсить.

Давайте выкинем ArrayList и LinkedList и просто разберемся с чтение файла по строкам!

Да за ООП - приходиться много платить и за весь стек интерфейсов и абстракций и всему должно быть объяснение ,

но не в секунды , когда тот же awk - делает эту же задачу на порядок быстрее!
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563721
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev,
К тому же, совершенно не понятно. ЗАЧЕМ это нужно. Один раз считать файл при загрузки приложение, что 0.5 сек, что 5 сек - роли большой иметь не должно. Нужна сверх скорость (близкая к ассемблеру) - перерабатывать постановку, делать нормальные форматы хранения данных и на диске и в памяти. Загонять миллионы объектов в LinkedList лично мне Java'у было бы жалко ))) Но я программировать учился на 286 с 1 Mb ОП и там ГИС писал (ГеоИнформационная система), т.ч. уже при словах LinkedList, миллион объектов мне компьютер и процессор жалко становится. Жалостливый я очень ))).


Скажем так - всегда считал что это быстро , когда писал такой код - и не задумывался о том 0.5 или 5 сек.

но когда решил проверить как такое же будет проходить в С++ или через простой awk - понял насколько медленно это делает JAVA
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563722
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исходные данные: лям строк, 50 колонок, 421 Mb файл

В общем, сильно зависит от heap'а. В пред. замерах при копи пасте кода автора ошибся, парсинг не шел.

На СОВЕРШЕННО ПУСТОМ heap'е.

Мой алгоритм 7 316 - 13 328 ms
Старая реализация 7 174 - 10 077 ms

На ЗАМУСОРЕННОМ heap'е. (результата предыдущего чтения файла остаются в памяти).

Мой алгоритм 15 181 - 19 079 ms
Старая реализация 18 856 - 19 914 ms

Что и понятно ))) По результатам есть чувство:
1. что String.split написан на native коде.
2. Работа JIT компилятора штука совершенно не предсказуемая ((( Добавление вызова пустого метода внутрь цикла - резко портит скорость.
3. Разворачивания методов в inline JIT компилятор делает крайне странно.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563724
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насколько я помню по C++: все listы - бяки, деревья - еще большие бяки. Array'и намного лучше. Компактнее лежат в памяти, при больших объемах значительный выигрыш по памяти и соответственно по производительности.

Такие задачи, обработка большого массива информации - сильно зависят от загаженности системы и настройки подсистемы памяти.

IMHO (на истину не претендую): Если eden достаточный, то лишние объекты и копирование туда-сюда сильно больших проблем создавать не должно. А вот old-gen heap работает значительно медленнее.

Для системы, если действительно нужно держать миллионы строк в памяти - я бы пытался хранить наиболее компактно. Java для этого, к сожалению, не самый лучший инструмент. ООП однако.

Ну и задача мне СОВЕРШЕННО НЕ ПОНЯТНА? Почему, если обработка данных настолько критична, ТЕКСТОВЫЙ файл?
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563731
DEVcoach
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Leonid KudryavtsevНу и задача мне СОВЕРШЕННО НЕ ПОНЯТНА? Почему, если обработка данных настолько критична, ТЕКСТОВЫЙ файл?Да всякое бывает. Почитайте, например, чем занимается компания Splunk. У них как раз джавовский продукт, который должен максимально быстро перелопачивать именно текстовые данные. Ничего в этом странного нет.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563733
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev
Ну и задача мне СОВЕРШЕННО НЕ ПОНЯТНА? Почему, если обработка данных настолько критична, ТЕКСТОВЫЙ файл?

Прилетел вам от клиента файл такого формата , строки с какой-то инфой разделенные табами...

Ну удобно им в файл писать - в виде имя \t номер телефона \t дата \t почта \t адрес итд...

и просят вас что то посчитать в этом файле - что то найти ...

ну вот мне и интересно стало - показалось что медленно читает по строкам ...

и действительно проверил : оставил только счетчик
Код: java
1.
2.
3.
4.
5.
6.
BufferedReader in = new BufferedReader(new InputStreamReader(NewClass.class.getResourceAsStream("in.txt")));
        String str = null;
        int c=0;
        while ((str = in.readLine()) != null) {
        c++;
        }



и аналогичный код на с++ через fopen и увидел что это в разы быстрее ... вот и задумался ...
(Хотя к слову сказать - в C++ можно получить результаты отличающиеся в 2 раза - только используя более свежую версию компилятора, но в любом случае на порядок быстрее чем в java)

чудеса.

поэтому и решил спросить - так ли это ? может кто знает почему так медленно ? где тут потери? в чем ?
на будущее чтобы знать ?

и чтобы лучше понимать этот волшебный мир java ! :)
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563744
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38563857
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Atum1но когда решил проверить как такое же будет проходить в С++ или через простой awk - понял насколько медленно это делает JAVAAtum1и аналогичный код на с++ через fopen и увидел что это в разы быстрее ...
Показывай полный код на java и полный аналогичный код на c++.

P.S. Arrays.asList и так возвращает (фактически) ArrayList незачем здесь создавать ещё один ArrayList (и копировать в него все элементы..), readLine, split и LinkedList тоже плохие слова.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38564017
Garrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПопробуй размер буфера побольше указать. Для больших файлов может помочь.
В данном случае, для правильной оптимизации, ещё необходимо подобрать размер буфера кратный размеру строки в файле. При "неправильном" размере буфера эффект может оказаться отрицательным.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38564056
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mkПоказывай полный код на java и полный аналогичный код на c++.


исходный файл на 1 млн строк вида ( размер порядка 65 Мб) :
авторname date phone email cost
Имя1 16.04.2014 07:16:15 79294595328 vrghjm0@gmail.com 110
Имя2 19.05.2014 06:48:26 79933782391 p25ghjgt1@ya.ru 23
имя2 08.06.2014 05:40:37 79812440379 h7ghgfh48@list.ru 15
...


JAVA лучшее время read file 899 ms

Код: java
1.
2.
3.
4.
5.
6.
7.
public static void main(String[] args) throws IOException, Exception {
     long time = System.currentTimeMillis();
        List<String> lines = Files.readAllLines(Paths.get("stat.txt"), Charset.forName("UTF-8"));
        System.out.println(lines.size());
     long t1 = System.currentTimeMillis() - time;
     System.out.println(" read file " + (t1) + " ms");
  }




С++ 139 ms , компилятор gcc 4.7.2, ядро 3.2.0-4, debian 7, Intel(R) Core(TM) i3-2120 CPU @ 3.30GHz


total heap usage:1,000,023 allocs, 1,000,023 frees, 86,061,056 bytes allocated
Код: plaintext
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.
50.
51.
52.
53.
54.
55.
56.
57.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unordered_map>
#include <string>
#include <stdint.h>
#include <vector>
#include <sys/time.h>
#include <list>


#define BUF_LINE_SIZE	2048

int main( int argc, char ** argv )
{
	std::vector<char *> lines_list;
	std::vector<char *>::iterator lit;
	FILE * fp;
	char line[BUF_LINE_SIZE];
	char * cptr;
	unsigned long linescount = 0;
	struct timeval t1, t2;
	uint64_t mscount;

	if ( 2 != argc )
	{
		printf( "usage: testp1 <infile>\n\n" );
		return 1;
	}

	fp = fopen( argv[1], "r" );
	if ( ! fp )
	{
		printf( "can't open file %s for read\n\n", argv[1] );
		return 2;
	}

	gettimeofday( &t1, 0 );

	for ( cptr = fgets( line, BUF_LINE_SIZE, fp ); cptr; cptr = fgets( line, BUF_LINE_SIZE, fp ) )
	{
		lines_list.push_back( strdup( cptr ) );
		++linescount;
	}
	gettimeofday( &t2, 0 );
	fclose( fp );
	mscount = (t2.tv_usec + (((uint64_t)t2.tv_sec)*1000000ULL))
		- (t1.tv_usec + (((uint64_t)t1.tv_sec)*1000000ULL));
	printf( "done, result %lu lines at %llu.%06llu seconds\n\n"
		, linescount, mscount / 1000000ULL, mscount % 1000000ULL );

	for ( lit = lines_list.begin(); lines_list.end() != lit; ++lit )
	{
		free( *lit );
	}
	return 0;
}



(Тут есть один нюанс - если читать в с++ файл построчно - не в массив ,то время будет в два раза лучше , чуть больше 65 ms)

...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38564140
just_vladimir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1 JAVA лучшее время read file 899 ms
Код: java
1.
2.
3.
4.
5.
6.
7.
public static void main(String[] args) throws IOException, Exception {
     long time = System.currentTimeMillis();
        List<String> lines = Files.readAllLines(Paths.get("stat.txt"), Charset.forName("UTF-8"));
        System.out.println(lines.size());
     long t1 = System.currentTimeMillis() - time;
     System.out.println(" read file " + (t1) + " ms");
  }


Оформите в виде jmh бенча, иначе цифры ни о чем не говорят.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38564151
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
just_vladimirОформите в виде jmh бенча, иначе цифры ни о чем не говорят.
тут все расписано !
http://nadeausoftware.com/articles/2008/02/java_tip_how_read_files_quickly

с 2008 года особо ничего не изменилось.

Тему можно закрыть !

Всем спасибо за помощь и участие.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38564362
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Leonid KudryavtsevНу и задача мне СОВЕРШЕННО НЕ ПОНЯТНА? Почему, если обработка данных настолько критична, ТЕКСТОВЫЙ файл?

Прилетел вам от клиента файл такого формата , строки с какой-то инфой разделенные табами...

В чем принципиальный смысл требования "2-е секунды" ?

Прилетел файл - обработали. 2 или 5 секунд думаю для оператора большой роли не играет.

Если обработка на сервере и файлы летают туда-сюда... важна не абсолютная скорость, а возможность масштабирования решения, например возможность выполняться много-потокова на туевой куче процессоров... тут за Java Вы заплатите скоростью, но выиграете в простоте и отказоустойчивости (меньше багов) результирующего кода + поддержка со стороны application server'ов, плюс поддержка кодировок, плюс куча других плюшек
Atum1Ну удобно им в файл писать - в виде имя \t номер телефона \t дата \t почта \t адрес итд...

и просят вас что то посчитать в этом файле - что то найти ...

Ну и нафига для того, что бы что-то подсчитать весь многомиллионный файл загонять в память. Пройтись, разпарсить, подсчитать.

Тут Java и любое другое ООП-решение конечно будет резко проигрывать, просто за счет туевой кучи лишнего кода на абстракциях. Без ООП - банальный конечный автомат и почти нулевые требования по памяти (только буффер для чтения файла), при ООП - классы и создание объектов.

При ООП подходе: Java обычно работает с память крайне быстро. Создание объектов в Java значительно БЫСТРЕЕ, чем в C++. Но и последующие проблемы с GC. Но здесь нужно память под приложение (не алгоритм, а приложение) настраивать. В продакшен системе крупного биллинга, после нормальной настройки eden области, у нас Full GC стал запускаться 2-а раза в сутки, вместо раз в 5-10 секунд. Но это нужно запускать JRE с нормальными настройками под задачу. AFAIK (выделение памяти замерял несколько лет назад, сейчас создавать тесты лениво).

Задача создать в памяти 50 миллионов объектов, что бы было - совсем не понятна. Нафига?
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38564368
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если метод подхватывается JIT-компилиром, время должно быть сравнимо. Если метод НЕ подхватывается JIT-компилиром, Java резко тормознутее. Что и понятно. Интерпретатор байт-кода.

Куча и потери на GC. При миллионах строк и миллионах объектов - отнюдь не бесплатно.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38564470
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Leonid KudryavtsevНу и задача мне СОВЕРШЕННО НЕ ПОНЯТНА? Почему, если обработка данных настолько критична, ТЕКСТОВЫЙ файл?

Прилетел вам от клиента файл такого формата , строки с какой-то инфой разделенные табами...

Ну удобно им в файл писать - в виде имя \t номер телефона \t дата \t почта \t адрес итд...

и просят вас что то посчитать в этом файле - что то найти ...

ну вот мне и интересно стало - показалось что медленно читает по строкам ...

Постановка немного абсурдна. Если вам "прилетел" файл - то пускай улетает обратно.
В продуктиве нет таких постановок. В противном случае если "очень нуна" и срочно - бородатый unix-сисадмин
возьмёт grep/sed/awk/find и найдет вам всё что нужно за приемлемое время. Если
мощи утилит не хватит - то напишет на perl-е парсер. Всяко это будет быстрее чем
делать в Java (Java проект - очень дорого стоит если стартовать его с нуля для
подобных Превед-Медвед-миров). Кстати это (perl) должно быть отправной
точкой при бенчмарках. В противном случае можно еще и усомниться в целесообразности
Java вообще в подобной задаче.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38564537
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы еще сказал, что еще крайне большая проблема - измерение производительности.

Мною написанный парсер явно на JIT-компиляторе не компилировался. С учетом появившегося в 1.5 (не знал) class-data-sharing, любая сферическая реализация на стандартных классах в вакууме должна быть быстрее

В продакшене, при загруженной системе и включившимся JIT-компиляторе, самопалный парсер должен ООП уделывать /надеюсь ))) /

Плюс мониторинг/настройка JVM: память (раз в нее закачиваются больше объемы), JIT.
====
Задача поставлена сферически. Загнать файл (неизвестного объема!!!) в дебильную структуру в памяти. При дебильном формате файла (текст, х.з. что с кодировками, в задаче не уточнено).

Нужна скорость, тогда в первую очередь:
1. Нормальный алгортм (для описанной задачи: пройтись один раз по файлу, разпарсить и обработать, сохранять в памяти и никакие LinkedList'ы даром не нужны).
2. Нормальные форматы хранения в памяти и на диске
3. Нормальная постановка, упрощение задачи. Универсальность решения VS самопал. Не универсально, но быстро.

IMHO & AFAIK
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38564550
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Коллеги выкинтье из головы вообще все Arrays, Lists и вообще коллекции! У вас
любая задача почему-то вырождается в Стебелёк! Занахрена
вам вообще в памяти Java нужны эти гигбайтные списки и массивы? Что с ними
дальше будете делать?
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38564554
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
LinkedList тут действительно не в тему - фичи, на которых он имеет преимущество (вставка и удаление в середине списка), по крайней мере, в приведенном коде, не используются. А вставка в конец и у ArrayList достаточно оптимально сделана, тем более, что можно сразу место зарезервировать, ориентируясь на размеры файла.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38564612
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для примера, создание и вставка 50 000 000 строк в LinkedList<String> и ArrayList<String>. На чистой 64 бит JVM. Наиболее показательны следующие вещи:
1. ОБЪЕМ который весь этот мусор занимает в памяти
2. Разница в объеме (компактность хранения) LinkedList vs ArrayList (> 20%)
3. Разница в скорости, при дефолтных параметрах JVM и запуск JVM с изначально выделенной памятью (!!!). Разница в скорость еще больше впечатляет, если смотреть на Task Manager ))), при дефолтных параметрах все мои 8 ядер под 100% заняты )))

Тестировал лет 10 назад, на ООП задачах (наплодить много объектов))) ), Java уделывает C++ ! Если бы C++ пример с парсингом в коллекцию был не такой сферический, не факт, что Java не вырвалась бы в отрыв AFAIK

>java.exe -server -classpath .\classes test.CreateArray
CreateArray time= 34488
totalMemory=6603407360
freeMemory=2434775960
usedMemory=4168631400

>java.exe -server -classpath .\classes -Xms8000m -Xmx8000m test.CreateArray
CreateArray time= 6532
totalMemory=6873939968
freeMemory=2705308568
usedMemory=4168631400

>java.exe -server -classpath .\classes test.CreateList
CreateList time=44889
totalMemory=7319060480
freeMemory=2230793400
usedMemory=5088267080

>java.exe -server -classpath .\classes -Xms8000m -Xmx8000m test.CreateList
CreateList time=11226
totalMemory=6873939968
freeMemory=1785672888
usedMemory=5088267080

>java.exe -server -classpath .\classes -Xms12000m -Xmx12000m test.CreateList
CreateList time=10848
totalMemory=12058624000
freeMemory=6970356920
usedMemory=5088267080


Кроме создания коллекции, еще и создаются 50 000 0000 строк через StringBuilder парой вложенных методов. Т.ч. в процессе создается и удаляется > 300 000 0000 StringBuilder'ов и куча промежуточных String.

Записанные в файл, те же данные занимают "всего" 844 Mb /far/. Т.ч. осмысленность тащить для обработки большой объем данных в память - нет никакого. Потери (в том числе и времени) на хранения в виде "рыхлых" объектов, может быть больше, чем создания временных объектов в динамике. (Java ОЧЕНЬ быстро создает объекты, если JVM и GC работает в комфортном режиме).

IMHO & AFAIK
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38564789
wst
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А дальше-то что с данными происходит? Если только просмотр-анализ можно же просто прочитать весь файл одной длинной строкой.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38564797
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1avp.mkПоказывай полный код на java и полный аналогичный код на c++.


исходный файл на 1 млн строк вида ( размер порядка 65 Мб) :
авторname date phone email cost
Имя1 16.04.2014 07:16:15 79294595328 vrghjm0@gmail.com 110
Имя2 19.05.2014 06:48:26 79933782391 p25ghjgt1@ya.ru 23
имя2 08.06.2014 05:40:37 79812440379 h7ghgfh48@list.ru 15
...


JAVA лучшее время read file 899 ms

Код: java
1.
2.
3.
4.
5.
6.
7.
public static void main(String[] args) throws IOException, Exception {
     long time = System.currentTimeMillis();
        List<String> lines = Files.readAllLines(Paths.get("stat.txt"), Charset.forName("UTF-8"));
        System.out.println(lines.size());
     long t1 = System.currentTimeMillis() - time;
     System.out.println(" read file " + (t1) + " ms");
  }




С++ 139 ms , компилятор gcc 4.7.2, ядро 3.2.0-4, debian 7, Intel(R) Core(TM) i3-2120 CPU @ 3.30GHz


total heap usage:1,000,023 allocs, 1,000,023 frees, 86,061,056 bytes allocated
Код: plaintext
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.
50.
51.
52.
53.
54.
55.
56.
57.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unordered_map>
#include <string>
#include <stdint.h>
#include <vector>
#include <sys/time.h>
#include <list>


#define BUF_LINE_SIZE	2048

int main( int argc, char ** argv )
{
	std::vector<char *> lines_list;
	std::vector<char *>::iterator lit;
	FILE * fp;
	char line[BUF_LINE_SIZE];
	char * cptr;
	unsigned long linescount = 0;
	struct timeval t1, t2;
	uint64_t mscount;

	if ( 2 != argc )
	{
		printf( "usage: testp1 <infile>\n\n" );
		return 1;
	}

	fp = fopen( argv[1], "r" );
	if ( ! fp )
	{
		printf( "can't open file %s for read\n\n", argv[1] );
		return 2;
	}

	gettimeofday( &t1, 0 );

	for ( cptr = fgets( line, BUF_LINE_SIZE, fp ); cptr; cptr = fgets( line, BUF_LINE_SIZE, fp ) )
	{
		lines_list.push_back( strdup( cptr ) );
		++linescount;
	}
	gettimeofday( &t2, 0 );
	fclose( fp );
	mscount = (t2.tv_usec + (((uint64_t)t2.tv_sec)*1000000ULL))
		- (t1.tv_usec + (((uint64_t)t1.tv_sec)*1000000ULL));
	printf( "done, result %lu lines at %llu.%06llu seconds\n\n"
		, linescount, mscount / 1000000ULL, mscount % 1000000ULL );

	for ( lit = lines_list.begin(); lines_list.end() != lit; ++lit )
	{
		free( *lit );
	}
	return 0;
}



(Тут есть один нюанс - если читать в с++ файл построчно - не в массив ,то время будет в два раза лучше , чуть больше 65 ms)



Я может чего то не понимаю, как bufferedreader может быть быстрее filechannel? Вы не ошиблись?
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38565261
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОзверинЯ может чего то не понимаю, как bufferedreader может быть быстрее filechannel? Вы не ошиблись?

filechannel быстрее bufferedreader . (кажется по ссылке что я указал это как раз и описано )

а можно увидеть код построчного чтения файла?

можно ли читать файл исключительно по следовательно по одной строке? (может быть через randomaccessfile)

сразу обрабатывая текущую строку и переходя на след. не создавая буферов, массивов строк , коллекций итд ...

будет ли это быстрее?
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38565285
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1а можно увидеть код построчного чтения файла?

Ничего интересного. ReadLine использует посимвольное чтение из буфера символов char[] cb в цикле и
накапливает строку в StringBuffer.

Кстати это яркий пример реализации конечного автомата. У него есть состояния.

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/io/BufferedReader.java#BufferedReader.readLine(boolean)

можно ли читать файл исключительно по следовательно по одной строке? (может быть через randomaccessfile)
сразу обрабатывая текущую строку и переходя на след. не создавая буферов, массивов строк , коллекций итд ...
будет ли это быстрее?

Можно. Но при этом мы теряем возможность работать с канальными устройствами (stdin, pipes e.t.c)
т.к. "режим открывания" файла становится более жёстким.

Думаю что быстрее не будет. Вообще дисковый интерфейс спроектирован так что на любой
чих HDD читает или пишет сектор (512 байт) или более крупный блок информации в зависимости
от типа устройства. Поэтому чтение избирательными порциями - безсмысленно. Оно не приводит
к особому убыстрению. Для вычитки строк можно просто вычитать "на будущее" char[] буфер
поболее и работать с ним как в BufferedReader.

Вычитывание по символам или по байтам - это просто софтварная надстройка на уровне OS API.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38565301
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Самое интересное, что попытка в своем классе сделать простейший конечный автомат дает ужасную производительность. При этом все стопориться на if... или на switch....

Добавление даже одного if в код, тут же посимвольную обработку _резко_ замедляет (((

Теоретически, вроде все понятно. Практически, за 2-а дня я на самодельном конечном автомате только достиг скорости исходного алгоритма (правда при _значительно_ меньшем потребности к выделению на куче и к GC) при значительно большей простоте алгоритма (минус все преобразование символов, никаких StringBuilder'ов).

В общем JIT-компилятор штука загодочная. Несмотря на то, что -XX:+PrintCompilation и -XX:+PrintInlining уверяют, что весь код откомпилирован. Рантайм библиотеки работают быстрее (или так же) самопального конечного автомата.

Хотя... это теоретически... практически задача ИМХУ - сферический конь в вакууме.

Чем скорость решения со split автора не устраивает - не понятно. Хотя, у него скорее всего вообще все на GC может стоять колом. У меня за 1.8-2 сек файл в 844 Mb парсится (без сохранения в LinkedList, только до String[])
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38565319
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Думаю что здесь уже нельзя достичь больше производительности по той простой
причине что мы играем по правилам реализации java.lang.String. Можно было-бы
читать byte[] договорившись что рассматриваем single-byte encoded file но
на выхлопе не сможем получить String. Или сможем но опять будет трансформация
кодировки со всеми накладными расходами.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38565416
Alex Kuznetsov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДумаю что здесь уже нельзя достичь больше производительности по той простой
причине что мы играем по правилам реализации java.lang.String. Можно было-бы
читать byte[] договорившись что рассматриваем single-byte encoded file но
на выхлопе не сможем получить String. Или сможем но опять будет трансформация
кодировки со всеми накладными расходами.Без понимания того, в какой кодировке приходит файл, как он затем должен быть обработан и что впоследствии должно получиться, действительно можно гадать о том как улучшить производительность.
Вполне может статься, что данные приходят в Win1251 кодировке, поэтому просто byte[] чтение с приведением к char[] вполне может решить исходную задачу.
Но это как говорится только автору известно.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38565890
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, все хуже. String'и и все остальное работает крайне быстро. Тут все упирается в JIT-компилятор. А вот как он код оптимизирует - ведает только он.

Тот конечный автомат, который написал я, банально стоит колом на IF...'а и SWITCH'е (для определения что пришло во входном потоке \t,\n,\r или просто символ). От перестановки IF..ELSE местами, скорость меняется в разы. Только не понятно, толи я уже наткнулся на предел работы процессора (промахи предсказания перехода, промахи кеша), толи приколы JIT компилятора. Толи все вместе. Но как стандартный код умудряется давать ту же скорость - мне не понятно, но честно говоря, практического интереса для меня не представляет. Хотя, возможно, я где-то с замерами ошибся .

У меня файл 844 Mb (лям строк, 50 полей) предельные цифры: чтения с диска 700 ms (844/0.7=1205 Mb/s, явно из кэша ОС читает), 1251 -> char = 100 ms, и парсинг + конструирования string[] от 1.1 до 3 сек.

Если переписать 10 строк Java на Native код, будет быстрее. Но сейчас 30% времени - тупо чтение файла (нативные методы JRE), 60% обработка. Т.е. Java -> Native C даст выигрыш на _всей_ задачи парсинга не более в 3 раза. С учетом последующей обработки (зачем-то же файл читается) - еще меньше. Оно того нужно? По совокупности, а не ради спортивного интереса.

Ради спортивного интереса можно и на асме под проц. затачивать (смотреть в Intel Vtune и промахи оптимизировать) или много-потоковую обработку файла (как в Oracle ))) parallel full table scan и etc ))) ) сделать. Да на кластер! Вот где скорость будет!

Если автор оплатит - можно и запилить.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38565910
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevЕсли переписать 10 строк Java на Native код, будет быстрее. Но сейчас 30% времени - тупо чтение файла (нативные методы JRE), 60% обработка. Т.е. Java -> Native C даст выигрыш на _всей_ задачи парсинга не более в 3 раза.
Думаю что не будет быстрее. У вас будут накладные расходы на JNDI callbacks в случае если
вы должны всё равно переходить в контекст Java-кода.

Если мы говорим о С++ - то это оффтопик и отдельный вопрос в отдельный форум.

В целом I/O (since 6) Java IO (NIO) достаточно хорошо написан чтобы вообще не думать о явном
использовании средств ОС.

Если у автора стоит задача - прогрузить это всё в БД (bulk load/bulk insert) то надо сначала
выкурить всякие утилитки от вендора БД, собрать на их базе макет или скриптик, потестировать
а уж после этого делать свой bulk-велосипед.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38565914
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
JNI тоесть.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38566017
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем, запустить ИСХОДНЫЙ C++ и Java код на своем компьютере со своим примером файла 885 Mb.

C++ (откомпилировано в Debug mode /без оптимизации/, вызов gettimeofday заменен на timeGetTime):


потребление памяти по Task Manager из Windows 921 584 Mb
parsing + create collection = 9100
free memory = 977


C++ (откомпилировано в Release):

parsing + create collection = 3457
free memory = 160


Java, старый алгоритм автора, но сохраняет все данные в ArrayList<String[]> (Ну не люблю я списки и деревья! Старая, десятилетняя ненависть!). Настройки JVM -Xms8000m -Xmx8000m

ParserOld time=2823
Total Garbage Collections: 1
Total Garbage Collection Time (ms): 480
arr.size=1000000
totalMemory=8039104512
freeMemory=6197443160
usedMemory=1841661352
-----
Total Garbage Collections: 5
Total Garbage Collection Time (ms): 1369
totalMemory=8039104512
freeMemory=8038830432
usedMemory=274080
total time=3715


Отсюда вопрос: и где Java медленнее?
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38566036
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонид! На что мы должны смотреть? Здесь ничего нет. Нет
кода который можно было-бы комментировать.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38566045
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сравнение i/o на java и на c/c++ в основном это замеры оверхеда от выделения памяти виртуальной машиной т.к. все массивы байт скопируются по N-раз пока дойдут до места, где java-разработчик может ими начать оперировать.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38566047
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonДумаю что не будет быстрее....
Будет, будет... ))) JNDI вряд ли сильно большие накладные расходы дает, оно же в одном окружении.

Зато на C и ASM'е можно с предсказателем переходов поиграться ))) и правильный порядок If...else... поставить )))

В общем, пока моя имплементация конечного автомата медленнее исходной реализации автора на стандартных Java функция (((. Правда зато память используется намного меньше! А память это лишняя работа GC, при многопотоковости/многопользователях это может быть важнее, чем пиковая скорость.

Вообще, тема интересная. Много нового о Java узнал. Только расстраивает, что JIT-компилятор совершенно черный ящик.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38566066
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev, при чём здесь вообще Си и Ассемблер? При чём здесь вообще if-else ?
Это всё вопросы не в тему топика.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38566102
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А чего коментировать? Исходная задача автором не описана. Исходного файла от автора нет.

То, что Java ЗНАЧИТЕЛЬНО медленнее C++, он НЕ прав.

Исходной код автора 15580799 C++[/msg] и 15576134 Java[/msg], работает лично на моей машине одинаковое/сравнимое время. Если -Xms8000m -Xmx8000m выставить ))).

При этом, замеры скорость явно выше скорости чтения с физических дисков /даже мой SSD такой скорости давать не должен/. Т.ч. мерится сферический конь в вакууме. На реальной задаче , Subj смысла не имеет.

Мне профит: прочитал кучу статей о JIT-компиляторе и узнал кое-что новое по синтаксису Java.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38566133
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonLeonid Kudryavtsev, при чём здесь вообще Си и Ассемблер? При чём здесь вообще if-else ?
Это всё вопросы не в тему топика.
Притом, что скорость исходного кода автора, при нормальной настройке окружения Java - похоже приближается к пределу железа.
Выделение памяти/объектов, для Java операция почти "бесплатная" (если в eden)

Если хочется быстрее "парсить" (проверять пришедший символ на \r, \n) - то тогда только оптимизация под проц (промахи переходов, кеша и т.д.) )))
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38566278
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я напоминаю что мы находимся в форуме Java и автору, скорее всего будут неинтересны
решения на pure C/C++/Assembler.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38566823
Озверин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1ОзверинЯ может чего то не понимаю, как bufferedreader может быть быстрее filechannel? Вы не ошиблись?

filechannel быстрее bufferedreader . (кажется по ссылке что я указал это как раз и описано )



но именно ваш код используется Files.readAll или что то типа того, которая является оберктой для bufferedreader`а.?!
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38567131
avp.mk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Atum1исходный файл на 1 млн строк вида ( размер порядка 65 Мб) :
авторname date phone email cost
Имя1 16.04.2014 07:16:15 79294595328 vrghjm0@gmail.com 110
Имя2 19.05.2014 06:48:26 79933782391 p25ghjgt1@ya.ru 23
имя2 08.06.2014 05:40:37 79812440379 h7ghgfh48@list.ru 15
JAVA лучшее время read file 899 ms
Код: java
1.
2.
3.
4.
5.
6.
7.
public static void main(String[] args) throws IOException, Exception {
     long time = System.currentTimeMillis();
        List<String> lines = Files.readAllLines(Paths.get("stat.txt"), Charset.forName("UTF-8"));
        System.out.println(lines.size());
     long t1 = System.currentTimeMillis() - time;
     System.out.println(" read file " + (t1) + " ms");
  }

С++ 139 ms , компилятор gcc 4.7.2, ядро 3.2.0-4, debian 7, Intel(R) Core(TM) i3-2120 CPU @ 3.30GHz

total heap usage:1,000,023 allocs, 1,000,023 frees, 86,061,056 bytes allocated
Код: plaintext
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.
50.
51.
52.
53.
54.
55.
56.
57.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unordered_map>
#include <string>
#include <stdint.h>
#include <vector>
#include <sys/time.h>
#include <list>


#define BUF_LINE_SIZE	2048

int main( int argc, char ** argv )
{
	std::vector<char *> lines_list;
	std::vector<char *>::iterator lit;
	FILE * fp;
	char line[BUF_LINE_SIZE];
	char * cptr;
	unsigned long linescount = 0;
	struct timeval t1, t2;
	uint64_t mscount;

	if ( 2 != argc )
	{
		printf( "usage: testp1 <infile>\n\n" );
		return 1;
	}

	fp = fopen( argv[1], "r" );
	if ( ! fp )
	{
		printf( "can't open file %s for read\n\n", argv[1] );
		return 2;
	}

	gettimeofday( &t1, 0 );

	for ( cptr = fgets( line, BUF_LINE_SIZE, fp ); cptr; cptr = fgets( line, BUF_LINE_SIZE, fp ) )
	{
		lines_list.push_back( strdup( cptr ) );
		++linescount;
	}
	gettimeofday( &t2, 0 );
	fclose( fp );
	mscount = (t2.tv_usec + (((uint64_t)t2.tv_sec)*1000000ULL))
		- (t1.tv_usec + (((uint64_t)t1.tv_sec)*1000000ULL));
	printf( "done, result %lu lines at %llu.%06llu seconds\n\n"
		, linescount, mscount / 1000000ULL, mscount % 1000000ULL );

	for ( lit = lines_list.begin(); lines_list.end() != lit; ++lit )
	{
		free( *lit );
	}
	return 0;
}



(Тут есть один нюанс - если читать в с++ файл построчно - не в массив ,то время будет в два раза лучше , чуть больше 65 ms)


Хм.. У меня не такой большой отрыв.
Java GCC 4.6.2 MS VS 2010 (дабл кликом по exe'шнику) Из-под визуал студии (не дебаг)220Mb (Cp1251; 1 000 000 строк) 2758.562927 ms 2312 ms 2500 ms 3187 ms

На твоих данных тоже отрыв меньше.
Java GCC 4.6.2 MS VS 2010 (дабл кликом по exe'шнику) Из-под визуал студии (не дебаг)57Mb (UTF-8; 1 000 000 строк) 1134.198872 ms 765 ms 796 ms 1375 ms54Mb (Cp1251; 1 000 000 строк) 1112.455888 ms 734 ms 796 ms 1344 ms

"Твои данные" получил так:
TextGen.java
Код: 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.
package textgen;

import java.io.IOException;
import java.io.Writer;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;

public class TextGen {

    private static final Charset
//            CHARSET = StandardCharsets.UTF_8;
            CHARSET = Charset.forName("Cp1251");

    public static void main(String[] args) throws IOException {
        try (Writer writer = Files.newBufferedWriter(Paths.get("D:\\src.txt"), CHARSET)) {
            writer.write("name date phone email cost\n");
            for (int i = 1; i < 333_334; ++i) {
                writer.write("Имя1 16.04.2014 07:16:15 79294595328 vrghjm0@gmail.com 110\n");
                writer.write("Имя2 19.05.2014 06:48:26 79933782391 p25ghjgt1@ya.ru 23\n");
                writer.write("имя2 08.06.2014 05:40:37 79812440379 h7ghgfh48@list.ru 15\n");
            }
        }
    }
}



Сравнение не совсем чесное. Если в java длина строки будет больше буффера - буффер увеличится (создастся новый массив, а значения из старого будут скопированны в новый). В С++ программе строка длинее буфера будет просто обрезана.
(с utf-8 кодировкой эта C++ программа тоже работать не умеет.. просто байты)
Всякие настройки C++ компилятора не крутил ибо не умею.


Твой код маленько отрефакторил
ReadFile.java
Код: 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.
package standartreadfile;

import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;

import static java.lang.System.*;

public class ReadFile {

    private static final Charset
//            CHARSET = StandardCharsets.UTF_8;
            CHARSET = Charset.forName("Cp1251");
    
    public static void main(String[] args) throws IOException {
        long time = nanoTime();
        List<String> lines = Files.readAllLines(Paths.get("D:\\src.txt"), CHARSET);
        time = nanoTime() - time;
        out.println(lines.size());
        out.println("read file   : " + time / 1e6 + " ms");
    }
}

ReadFile.cpp
Код: plaintext
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.
#include <conio.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <vector>

using namespace std;

const int BUF_LINE_SIZE = 2048;

int main() {
    FILE* file = fopen("D:\\src.txt", "r");
    if (!file) {
        cout << "can't open file for read" << endl;
        return 2;
    }

    vector<char*> lines;
    char line[BUF_LINE_SIZE];

    clock_t time = clock();
    for (char* cptr = fgets(line, BUF_LINE_SIZE, file); cptr; cptr = fgets(line, BUF_LINE_SIZE, file)) {
        lines.push_back(strdup(cptr));
    }
    time = clock() - time;
    fclose(file); //а в джава коде сначала закркываем, а потом мереем ;)

    cout << lines.size() << endl;
    cout << "read file   : " << time * 1000 / CLOCKS_PER_SEC << " ms" << endl;

    time = clock();
    for (vector<char*>::iterator it = lines.begin(); lines.end() != it; ++it) {
        free(*it);
    }
    time = clock() - time;
    cout << "clean memory: " << time * 1000 / CLOCKS_PER_SEC << " ms" << endl;
//    _getch();
    return 0;
}


До того как порефакторил было также. Правда найти под виндой правильный аналог sys/time.h ума не хватило.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38567334
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avp.mk, у вас - смешанный бенчмарк. Он меряет и IO и аллокацию списков.
Это создаёт некоторую путаницу. Мы не в состоянии делать выводы.

У вас - однопоточное приложение поэтому вы можете детектировать раздельное
время на эти две операции. Шаблон Files.readAllLines доступен в исходниках
поэтому его тоже можно развалить на атомы и сделать отдельные счётчики
по диску и работе со строками и списками.

Если ваш код работает слишком быстро - то вы его запускаете многократно
и меряете average. Если у вас два теста то вы запускаете их поочерёдно
Test1, Test2, Test1, Test2 и тоже усредняете результаты.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38567396
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonПостановка немного абсурдна. Если вам "прилетел" файл - то пускай улетает обратно.
В продуктиве нет таких постановок.
+!
аффтару в конторе заняться нечем.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38567528
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonavp.mk, у вас - смешанный бенчмарк. Он меряет и IO и аллокацию списков.
Это создаёт некоторую путаницу. Мы не в состоянии делать выводы.

Бенч как раз хороший, ровно то, что просил _автор_ топика. У меня такой же результат "Java vs C-код - ничья", при этом C код в режиме debug /без оптимизации/ значительно проигрывает Java.

А вообще Assembler всех забивает с огромным отрывом ))).

А мерить и нечего:
IO - что C, что Java даст одинаковую скорость. Это целиком зависит от дисков и ОС.
Последующая обработка - разделение на строки (по символу '\n') и парсинг ('\t'). Код на C _всегда_ будет в выигрыше, но скорее всего менее универсален/функционален.
Выделение памяти - Java значительно быстрее (мерил лет 10 назад), но проблемы с GC. Если GC не работает (заранее правильное выделение памяти), то Java и C# уделывают C.
Компактность хранения данных в памяти - C/C++ выигрывает с отрывом. На C/C++ можно хранить значительно компактнее, на Java классы более универсальны и нет возможности адресной арифметики (указателей) C.
etc...

Данные вещи вроде как очевидны исходя из архитектуры. Мерить смысла нет. Кому нечем заняться, могут пытаться написать корректный ))) бенчмарк и заняться холеваром.


schwaСравнение i/o на java и на c/c++ в основном это замеры оверхеда от выделения памяти виртуальной машиной т.к. все массивы байт скопируются по N-раз пока дойдут до места, где java-разработчик может ими начать оперировать.
IMHO Оверхид достаточно маленький.

AFAIK:
1) На Java выделение памяти практически "бесплатно" с точки зрения CPU. Все проблемы с аллокацией проявятся только на стадии GC. Особенно в нормально нагруженном продакшене. Когда пара десятков юзеров будет разом eden область в куче засирать.
2) Тупое копирование строки операция крайне быстрая. Т.к. оптимизирована под CPU.

Тут больше имеет проблема промахи предсказателя переходов и кеша. Без промахов, скопировать пару десятков байт дешевле, что с промахами проверить один символ на равенство \n' ))). Но это очень сильно тюнеть программу нужну. И ставить Intel VTune, что бы смотреть, какие конвейеры в процессоре затыкается.

В данном случае, все исключительно зависит от качества JIT-компилятора.

При ООП программирование и одинаковых классах, JAVA, скорее всего, даст более высокую скорость, чем C++. Вызов виртуального метода JIT-компилятор заинлайнить может, а C++ компилятор нет.

Сравнивать C-код и Java-код очень сложно. Больно все разное. С-код без ООП скорее всего будет на порядки быстрее любого ООП-шного. Но и, скорее всего, менее функционален. Т.к. никто в здравом уме, не будет самопальную поддержку 100500 кодовых страниц реализовывать. Тут выбор: или скорость или универсальность.

Ну и нормальный C-программисту и в голову не придет, для задачи "...просят вас что то посчитать в этом файле - что то найти..." 15579898 городить списки и затаскивать миллионно-строчный файл в память. Все "посчитают и найдут" просто проходом по байтовому массиву. )))
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38567747
chabapok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Потому что код плюсов и код жабы не идентичен.

String в жаве - более высокоуровневая сущность, чем char*

Само io знамает одинаковое время:
Код: 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.
 FileInputStream fis = new FileInputStream("src1251.txt");
        byte[] b = new byte[fis.available()];
        
        int offset= 0, length = b.length;
        int readed;
        do{
            readed = fis.read(b, offset, length);
            if (readed==-1) break;
            length = length-readed;
            offset += readed;
        }while(length>0);
        
        long now =System.currentTimeMillis(); 
        long t0 = now - time;
        time=now;
        
        ArrayList<String> r = new ArrayList();
        int from=0;
        
        for(int i=0;i<b.length; i++){
            if (b[i] == '\n'){
                String s= new String(b, from, i-from);
                r.add(s);
                i++;
                from = i;
            }
        }
        long t1 = System.currentTimeMillis() - time;
        
        System.out.println(" read file " + t0 + " ms. Parse file: "+t1+"ms");
        System.out.println("Lins count= "+r.size());



Результат:
Read file 108 ms. Parse file: 1415ms
Lins count= 1000000

На стандартных настройках gc.

Тут надо сказать почему вышло такое время парсинга. В жабе в хотспоте размер класса,c учетом всех выравниваний, кратен 64байтам. На многопоточных программах это дает мегпреимущества. Это значит, что когда делается new String, то создается несколько обьктов суммарным обьемом кратным 64. Попытаемся прикинуть сколько обьектов создается и сколько они займут
Естественно, приблизительно:

Сами обьекты String - 1000000, внутри каждого String есть char[] -- тоже 1000000 инстансов.
каждый стринг - считаем 64байта,
каждый char - два байта, строка около 60символов, это 120 байт, плюс заголовок у каждого обьекта где-то 12 байт. Т.е., ближайшее большее кратное длине кешлайна -- 192байта. Таким образом, на каждый стринг на все его инстансы надо 256байт минимум. И если у нас EDEN меньше суммарного обьема всех этих данных, то очевидно, что копирования не избежать.
Хотим быстро отпарсить 1М таких строк - выделите не менее 256мб EDEN. И это оценка снизу, т.е. на практике нужно больше.
Проверим это. Запустим парсинг с параметрами -Xms3584m -Xmx3584m , получаем 759мс, против 1533мс. Уже лучше. Это раз.

Два, как сказано выше, char* в сях и String не развнозначные классы. Чтобы сказать сколько символов в char*, надо затратить некоторое время, чтобы их подсчитать (и с учетом кодировки, побайтовая длина не подходит), а String тратит это время на этапе создания. Плюсы вообще, насколько знаю, не умеют работать с utf-8, в них есть wstring в которых 1 символ - 4 байта. C++11 вводит u16string, но на сегодня gcc который это может отктпилить, в стандартных репозиториях нет.

Вообще же, в седьмой жаве убрали "некопируемость" данных из строк для того чтоб работал escape-анализ. Для быстрой работы с большми строками рекомендуют direct ByteBuffer и CharSequence.
Если мы хотим аналогии с плюсами, действовать надо так -- сначала читаем все в ByteBuffer, после чего находим индексы всех \n и прибавляем к ним 1 - это будут указатели, аналог char*.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #38568014
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ivanra1000000 строк - 1000000 раз будет создаваться и компилироваться Pattern, скорее всего, можно ускорить разбор, заготовив Pattern заранее....
не подтвержденные сведения, но похоже на правду:
автор... В Java 7 разбиение на подстроки, в случае если шаблон состоит из одного символа, было оптимизировано в методе String.split. Всегда используйте этот метод для разбиения на подстроки в Java 7...
(C) http://java-performance.com/ru/
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Быстрое чтение и разбор файла
    #39404623
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UP

вот нашел задачу , которая не проходит на 11 тесте по времени ...его просто не хватает ...

какие могут быть решения?

https://acmp.ru/index.asp?main=task&id_task=41

На планете «Аурон» атмосфера практически отсутствует, поэтому она известна своими перепадами температур в различных точках. Известно, что эти перепады колеблются от -100 до 100 градусов. Нашим специалистам удалось выяснить значения температур в N точках этой планеты. К сожалению, эти значения вычислены с большими погрешностями, поэтому их решили округлить до целых чисел. Хотелось бы наглядно видеть участки с повышенной и пониженной температурой. Вам требуется помочь. Вы должны упорядочить температуры участков по неубыванию.

Входные данные

В первой строке входного файла INPUT.TXT задано натуральное число N - количество участков (N <= 10^6). Во второй строке через пробел записаны целые значения температур этих участков, не превосходящие 100 по абсолютной величине.

Выходные данные

В единственную строку выходного файла OUTPUT.TXT нужно вывести разделенные пробелом значения температур всех известных участков, которые должны следовать друг за другом в порядке неубывания.


мое решение :
Код: 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.
import java.io.*;
import java.util.*;
   
class Main {
   
    public static void main(String[] args) {
        try (Scanner in = new Scanner(System.in);
                PrintWriter out = new PrintWriter(System.out)) {
   
            int n = in.nextInt();
            int[] array = new int[201];
            for (int i = 0; i < n; i++) {
                array[in.nextInt() + 100]++;
            }
            for (int i = 0; i < array.length; i++) {
                int b = array[i];
                if (array[i] != 0) {
                    for (int j = 0; j < array[i]; j++) {
                        out.print((i - 100) + " ");
                    }
                }
            }
            out.flush();
        }
    }
}


падает на 11 Time limit exceeded 2,145 7,9 Мб

Менял на


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
import java.io.*;
import java.util.*;

class Main {

    public static void main(String[] args) {
        try (BufferedReader sc = new BufferedReader(new FileReader("input.txt"));
                PrintWriter out = new PrintWriter(System.out)) {

            int n = Integer.parseInt(sc.readLine());
            String s = sc.readLine();
            Arrays.stream(s.split(" ")).mapToInt(Integer::parseInt).parallel().sorted().forEachOrdered(x->out.print(x + " "));
            out.flush();
        }catch(IOException exception){
            
        }
    }
}



падает на тесте 9 Memory limit exceeded 0,522 26 Мб


Нужно найти быстрое чтение , запись в файл +
быстрый разбор строки
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404647
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,
авторВ качестве критерия ранжирования лучших попыток служит размер кода закачиваемой программы.
OMFG...
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404659
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Убери конкатенацию строк.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404660
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAtum1,
авторВ качестве критерия ранжирования лучших попыток служит размер кода закачиваемой программы.
OMFG...

да, все честно )

самые быстры и короткие Это

https://acmp.ru/index.asp?main=bstatus&id_t=41

Python
и
С++

как правило ... по всем задачам ..

что говорит о выразительности языка ...

его скорости итд ... для олимпиад самое то ...

Правда меня иногда ставит в замешательство когда находятся люди предложившие решение на java в 135 строк - вопрос только один как ?



как они такое смогли сжать код ???? по некоторым задачам .
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404662
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

flush() не нужен.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404667
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1что говорит о выразительности языка ...
Питон он вообще заточен под подобные задачи. С плюсами просто всё понятно. А в Java у нас ООП. Только объекты и методы.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404668
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAtum1,

Убери конкатенацию строк.

201 значение это долго?

в каком месте ?

я уже и строку пытался читать посимвольно(нахожу число - добавляю в массив )
все равно медленно .
:(

ps

офф

https://acmp.ru/index.asp?main=task&id_task=1

вопрос как : получить 135 ?



ЗАДАЧА №1
A+B

(Время: 1 сек. Память: 16 Мб Сложность: 2%)
Требуется сложить два целых числа А и В.

Входные данные

В единственной строке входного файла INPUT.TXT записано два натуральных числа через пробел, не превышающих 109.

Выходные данные

В единственную строку выходного файла OUTPUT.TXT нужно вывести одно целое число — сумму чисел А и В.




размер 300


Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
import java.io.PrintWriter;
import java.util.Scanner;
 
public class Main {
 
    public static void main(String[] args) {
 
        try (Scanner in = new Scanner(System.in);
                PrintWriter out = new PrintWriter(System.out)) {
 
            solve(in, out);
        }
    }
 
  
    private static void solve(Scanner in, PrintWriter out) {
        int a = in.nextInt();
        int b = in.nextInt();
        out.println(a + b);
    }
 
}
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404670
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAtum1что говорит о выразительности языка ...
Питон он вообще заточен под подобные задачи. С плюсами просто всё понятно. А в Java у нас ООП. Только объекты и методы.

Была идея прорешать все задачи на java чисто в функциональном стиле ... но очень многие решения не проходят в таком стиле по памяти и времени :( Это печалит ...
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404680
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Размер кода: 199 ! максимум.
https://acmp.ru/index.asp?main=task&id_task=1
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
import java.io.*;
import java.util.*;
public class Main {
    public static void main(String[] args) {
        try (Scanner i = new Scanner(System.in);
                PrintWriter o = new PrintWriter(System.out)) {
        o.println(i.nextInt() +i.nextInt());
        }
    }
}
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404682
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chabapok Два, как сказано выше, char* в сях и String не развнозначные классы. Чтобы сказать сколько символов в char*, надо затратить некоторое время, чтобы их подсчитать (и с учетом кодировки, побайтовая длина не подходит), а String тратит это время на этапе создания.
Вы путаете реализацию языка и библиотеки!
Начнем с того, что char* это ни разу не класс, а указатель!
Для примера вопрос - на какой тип указывает указатель void*?

chabapok Плюсы вообще, насколько знаю, не умеют работать с utf-8
Это равносильно заявлению, что ключем 10х12 нельзя ремонтировать автомобили Хонда.
Плюсам глубоко фиолетово на кодировку, они работают с байтами, словами и другими типами.
Работа с кодировками это прерогатива программиста. Что накодит, то и получит.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404691
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        System.out.print(in.nextInt() + in.nextInt());
    }
}
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404805
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner i = new Scanner(System.in);
        System.out.print(i.nextInt() + i.nextInt());
    }
}



144
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404830
alexanderer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Atum1,

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
import java.util.*;

public class Main{
    public static void main(String[] a){
        Scanner i = new Scanner(System.in);
        System.out.print(i.nextInt() + i.nextInt());
    }
}

:)
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404831
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1 размер 300
Слишком много букафф пишешь. :)
D 300 включая пробелы влезяет и посложнее задача
Код: java
1.
public class T41{public static void main(String[] s){int a[]=new int[201];try(java.util.Scanner i=new java.util.Scanner(System.in);){for(int j=i.nextInt();j-->0;)a[i.nextInt()+100]++;}catch(Exception e){}for(int i=-1;i++<200;){for(int j=0;j++<a[i];){System.out.print(i-100);System.out.print(' ');}}}}


И то можно лишние проверки убрать :) Можно и конкатенакцию вернуть.
Пускается и с -Xmx1m -XX:MaxMetaspaceSize=2368K на 32-хбитной 8-ке
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404846
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1
144

public у класса не нужен, так как мы в рутовом пакете - это -6
args заменить на одну букву - 3
итого - 135
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404864
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczpublic у класса не нужен, так как мы в рутовом пакете - это -6
args заменить на одну букву - 3
итого - 135
А еще имя класса уменьшить - вообще рекордсменом станет. :)
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404867
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевА еще имя класса уменьшить - вообще рекордсменом станет. :)
Ты условия, по ходу, не читал. Имя класса - Main. Пробелы, табы и переносы строк при подсчете не участвуют.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404875
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевAtum1 размер 300
Слишком много букафф пишешь. :)
D 300 включая пробелы влезяет и посложнее задача
Код: java
1.
public class T41{public static void main(String[] s){int a[]=new int[201];try(java.util.Scanner i=new java.util.Scanner(System.in);){for(int j=i.nextInt();j-->0;)a[i.nextInt()+100]++;}catch(Exception e){}for(int i=-1;i++<200;){for(int j=0;j++<a[i];){System.out.print(i-100);System.out.print(' ');}}}}


И то можно лишние проверки убрать :) Можно и конкатенакцию вернуть.
Пускается и с -Xmx1m -XX:MaxMetaspaceSize=2368K на 32-хбитной 8-ке

не проходит... видимо Scanner очень медленная хрень .
11 Time limit exceeded 2,177 6,9 Мб

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
import java.util.*;

public class Main {

    public static void main(String[] s) {
        int a[] = new int[201];
        try (java.util.Scanner i = new Scanner(System.in);) {
            for (int j = i.nextInt(); j-- > 0;) {
                a[i.nextInt() + 100]++;
            }
        } catch (Exception e) {
        }
        for (int i = -1; i++ < 200;) {
            for (int j = 0; j++ < a[i];) {
                System.out.print(i - 100);
                System.out.print(' ');
            }
        }
    }
}
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404877
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczТы условия, по ходу, не читал. Имя класса - Main.
Это я не прочел - оно ж в решении всплыло и именно для java.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404882
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев

(Время: 2 сек. Память: 16 Мб Сложность: 29%)
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404885
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1не проходит... видимо Scanner очень медленная хрень .

Попробуй в буфер завернуть in и out.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404890
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczСергей АрсеньевА еще имя класса уменьшить - вообще рекордсменом станет. :)
Ты условия, по ходу, не читал. Имя класса - Main. Пробелы, табы и переносы строк при подсчете не участвуют.

Бинго :)

Код: java
1.
2.
3.
4.
5.
6.
7.
import java.util.*;
class Main {
    public static void main(String[] a) {
        Scanner i = new Scanner(System.in);
        System.out.print(i.nextInt() + i.nextInt());
    }
}



135

pascal 33 python 34

135:33 = 4 !


к вопросу о языках

https://habrahabr.ru/company/alconost/blog/197146/
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39404897
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1[11 Time limit exceeded 2,177 6,9 Мб

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
import java.util.*;

public class Main {

    public static void main(String[] s) {
        int a[] = new int[201];
        try (Scanner i = new Scanner(System.in);) {
            for (int j = i.nextInt(); j-- > 0;) {
                a[i.nextInt() + 100]++;
            }
        } catch (Exception e) {
        }
        for (int i = -1; i++ < 200;) {
            for (int j = 0; j++ < a[i];) {
                System.out.print(i - 100);
                System.out.print(' ');
            }
        }
    }
}



видимо есть какой-то вырожденный случай :

1)где долго работает Scanner
2)сложность O(n^2) в цикле где 2 фора.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405018
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1видимо есть какой-то вырожденный случай :
Сканер на миллионе чисел сработает долго и у меня (регэксп внутри).
Но дольше System.out.
Если сделать через StringBuilder то букв больше
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
import java.util.*;
public class T{
 static final int a[]=new int[201];
 public static void main(String[] s){
  try (Scanner i=new Scanner(System.in);){
   i.nextInt();
   for(;;)a[i.nextInt()+100]++;
  }catch (Exception e){}
  for(int i=-1;i++<200;){
   StringBuilder b=new StringBuilder();
   for(int j=0;j++<a[i];)b.append(i-100).append(' ');
   System.out.print(b);
  }
 }
}
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405031
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хотя без catch оно даже меньше
Код: java
1.
2.
3.
Scanner i=new Scanner(System.in);
i.nextInt();
while(i.hasNext())a[i.nextInt()+100]++;
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405033
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1видимо есть какой-то вырожденный случай :
1)где долго работает Scanner
2)сложность O(n^2) в цикле где 2 фора.
Буферизацию может таки добавим?
Худший случай это максимум значений "-100". Этот случай даёт самые длинные входные и выходные файлы. Плюс максимальное количество циклов вывода = (n * 2) - 1. Как там нарисовать O(n^2) - мне не понятно.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405040
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,

В StringBuilder стоит capacity добавить. ХЗ как они там память считают. Но строка в 5млн символов это уже 10Мб при потолке в 16.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405069
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAtum1видимо есть какой-то вырожденный случай :
1)где долго работает Scanner
2)сложность O(n^2) в цикле где 2 фора.
Буферизацию может таки добавим?
Худший случай это максимум значений "-100". Этот случай даёт самые длинные входные и выходные файлы. Плюс максимальное количество циклов вывода = (n * 2) - 1. Как там нарисовать O(n^2) - мне не понятно.


пробовал - вылетает по памяти на 9 тесте .

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
import java.util.*;
class Main{
 static final int a[]=new int[201];
 public static void main(String[] s){
  try (Scanner i=new Scanner(System.in);){
   i.nextInt();
   for(;;)a[i.nextInt()+100]++;
  }catch (Exception e){}
  for(int i=-1;i++<200;){
   StringBuilder b=new StringBuilder();
   for(int j=0;j++<a[i];)b.append(i-100).append(' ');
   System.out.print(b);
  }
 }
}


по времени
11 Time limit exceeded 2,147 39 Мб
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405096
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Код: 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 static java.lang.System.*;

class Main{
    public static void main(String[] x) throws Exception {
        byte[] a = new byte[201];
        int b;
        int v = 0;
        boolean n = false;
        while (in.read() != '\n');
        while (true){
            b = in.read();
            if(b == '-') {
                n = true;
            } else if(b >= '0' && b <= '9'){
                if(v > 0){
                    v *= 10;
                }
                v += b - '0';
            } else {
                if(n){
                    v = 0 - v;
                }
                a[v + 100]++;
                v = 0; n = false;
                if(b == -1) break;
            }
        }
        for (int i = -1; i++ < 200;) {
            for (int j = 0; j++ < a[i];) {
                out.print(i - 100);
                out.print(' ');
            }
        }
    }
}
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405106
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczAtum1,

Код: 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 static java.lang.System.*;

class Main{
    public static void main(String[] x) throws Exception {
        byte[] a = new byte[201];
        int b;
        int v = 0;
        boolean n = false;
        while (in.read() != '\n');
        while (true){
            b = in.read();
            if(b == '-') {
                n = true;
            } else if(b >= '0' && b <= '9'){
                if(v > 0){
                    v *= 10;
                }
                v += b - '0';
            } else {
                if(n){
                    v = 0 - v;
                }
                a[v + 100]++;
                v = 0; n = false;
                if(b == -1) break;
            }
        }
        for (int i = -1; i++ < 200;) {
            for (int j = 0; j++ < a[i];) {
                out.print(i - 100);
                out.print(' ');
            }
        }
    }
}



Тест Результат Время Память
1 Wrong answer 0,191 725 Кб
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405114
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Если по скорости пролезет - синтаксис можно немного ужать чтобы в топ выйти. В if/else стоит числа проверять до знака, так как они по статистике должны быть чаще.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405119
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пережал до 320. Над циклом вывода сильно не думал. Может там ещё что-то можно почикать...

Код: 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.
class Main{
    public static void main(String[] x) throws Exception {
        byte[] a = new byte[201];
        int b, v = 0, n = 1;
        while (System.in.read() != 10);
        for(;;){
            b = System.in.read();
            if(b == 45) {
                n = -1;
            } else if(b >= 48 & b <= 57){
                if(v > 0){
                    v *= 10;
                }
                v += b - 48;
            } else {
                v *= n;
                a[v + 100]++;
                v = 0;
                n = 1;
                if(b < 0) break;
            }
        }
        for (b = -1; b++ < 200;) {
            for (v = 0; v++ < a[b];) {
                System.out.print(b - 100 + ' ');
            }
        }
    }
}
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405157
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПережал до 320. Над циклом вывода сильно не думал. Может там ещё что-то можно почикать...

Код: 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.
class Main{
    public static void main(String[] x) throws Exception {
        byte[] a = new byte[201];
        int b, v = 0, n = 1;
        while (System.in.read() != 10);
        for(;;){
            b = System.in.read();
            if(b == 45) {
                n = -1;
            } else if(b >= 48 & b <= 57){
                if(v > 0){
                    v *= 10;
                }
                v += b - 48;
            } else {
                v *= n;
                a[v + 100]++;
                v = 0;
                n = 1;
                if(b < 0) break;
            }
        }
        for (b = -1; b++ < 200;) {
            for (v = 0; v++ < a[b];) {
                System.out.print(b - 100 + ' ');
            }
        }
    }
}



1 Wrong answer 0,215 157 Кб

где то ошибка в алгоритме .
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405158
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz
Код: java
1.
                System.out.print(b - 100 + ' ');


Косячок-с.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405162
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1где то ошибка в алгоритме .
При компрессии налажал с чаром. Но что в первом варианте не так было не врублюсь. Мои тесты нормально сортирует :(.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405168
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПри компрессии налажал с чаром. Но что в первом варианте не так было не врублюсь. Мои тесты нормально сортирует :(.
Кажется дошло. Просто я тупой.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405188
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: 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.
class Main{
    public static void main(String[] x) throws Exception {
        int[] a = new int[201];
        int b, v = -1, n = 1;
        while (System.in.read() != 10);
        for(;;){
            b = System.in.read();
            if(b == 45) {
                n = -1;
            } else if(b >= 48 & b <= 57){
                v = v >= 0 ? v * 10 : 0;
                v += b - 48;
            } else if(v >= 0){
                v *= n;
                a[v + 100]++;
                v = -1;
                n = 1;
            }
            if(b < 0) break;
        }
        for (b = -1; b++ < 200;)
            for (v = 0; v++ < a[b];)
                System.out.print(b - 100 + " ");
    }
}



Можно попробовать ещё знак n упаковать в значение v. Но вряд ли получится меньше кода.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405201
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
313! А память там реально от балды считается. Прыгает от 7,5 до 9,5 на идентичном коде.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405227
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
307 и я уже заколебался.
Код: 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.
class Main{
    public static void main(String[] x) throws Exception {
        int[] a = new int[201];
        int b = 1,v = 0, n = 0;
        while (System.in.read() != 10);
        for(;b > 0;){
            b = System.in.read();
            if(b >= 48){
                v = v * 10;
                v += b - 48;
                n = n < 0 ? n : 1;
            } else if(b == 45) {
                n = -1;
            } else if(n != 0){
                v *= n;
                a[v + 100]++;
                v = n = 0;
            }
        }
        for (b = -1; b++ < 200;)
            for (v = 0; v++ < a[b];)
                System.out.print(b - 100 + " ");
    }
}


Если у кого есть идеи куда дальше ужимать - с радостью выслушаю.
Второй цикл можно через while написать, длинна выходит точно такая же. От третьего условия избавится не получилось, хотя есть чувство, что можно. Не выяснил ещё есть ли в тестах хвостовой пробел. Возможно с этим знанием можно как-то условия сократить.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405252
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЕсли у кого есть идеи куда дальше ужимать - с радостью выслушаю.
Проблема блин в System.out - у меня медленный. (Чисто печать - разбор и на стримсах копейки по времени).
Из-за двухбайтовой кодировки - одного SB + оно же напечатать - много.

P.S.
Код: java
1.
2.
v *= n;
a[v*n + 100]++;
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405264
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев
Код: java
1.
2.
v *= n;
a[v*n + 100]++;


Вот спасибо! Этот инлайн я провтыкал. У меня ещё на счёт вывода есть идеи, но с наскока не получилось сократить.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405313
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, да тут ещё выкидывать и выкидывать. Оба умножения я провтыкал. В выводе можно одну переменную вообще выкинуть. Попробую завтра до 300 добить.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405314
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczУ меня ещё на счёт вывода есть идеи, но с наскока не получилось сократить.
Еще символ хотел выкинуть?
Код: java
1.
for (;v<201;) if(a[v]-->0) System.out.print(v-100+" "); else v++;
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405335
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
но это чертовски медленно, а ускорение, по типу
Код: java
1.
2.
3.
String s="";
for (;v<201;) if(a[v]-->0){if(++b%9==0){System.out.print(s);s="";}s+=v-100+" ";}else v++;
System.out.print(s);


требует много символов :(

Есть вариант String не объявлять, но требует хотя бы одного параметра при вызове. :)
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405337
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев,

Да, так и сделал. Хочу ещё первый цикл выкинуть, так как он длинный. Но слишком много новых условий выходит.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405338
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
298!
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405341
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1
Код: java
1.
            Arrays.stream(s.split(" ")).mapToInt(Integer::parseInt).parallel().sorted().forEachOrdered(x->out.print(x + " "));


Не позорься.

Когда ты писал хакатоны со Streams - то это было респектабельно и красиво. И я тебя уважал. Но перфрманс - это явно не твоё.

split никогда не работал эффективно. Если ты хочешь производительность - то
никаких аллокаций и сплитов. Пили свой FSM и парсер текстового стрима.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405345
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
287 после слияния циклов чтения.
Код: 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.
class Main{
    public static void main(String[] x) throws Exception {
        int[] a = new int[201];
        int b=0,v=0,n=9;
        for(;b > -1;){
            b = System.in.read();
            n = b == 10 ? 0 : n;
            if(n<9)
            if(b >45){
                v *=10;
                v += b - 48;
                n = n < 0 ? n : 1;
            } else if(b == 45) 
                n = -1;
             else if(n != 0){
               a[v *n+ 100]++;
                v = n = 0;
            }
        }
        for ( ; n++ < 201;)
            for (; a[n-1]-->0;)
                System.out.print(n - 101 + " ");
    }
}


И никакой обфускатор не нужен.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405352
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
285... единственное жирное место это отдельная переменная под знак.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405380
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz
Код: java
1.
v *= 10;

Код: java
1.
v = (v << 3) + (v << 1);
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405382
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman,

Я в курсе. Но в этом дурацком конкурсе борьба за код, а не за производительность.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405383
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

ок.
тогда все for'ы заменить на while
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405384
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usmanтогда все for'ы заменить на whileи вроде бы все
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405415
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usmanтогда все for'ы заменить на while
Вот что значит свежим взглядом! Я уже и не заметил. Вот только проблема в том что while и for;; - оба пять символов.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405419
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usmanи вроде бы все
Ну, у меня есть несклько идей. Например, как бы последнее условие выкинуть. Тогда n может быть 1 или -1, без 0. Но тогда выходит ложный инкремент для значения 0. То ли пробел у них в конце тестовых файлов, то ли перенос строки. И ещё вместро тренарного оператора что-то покороче хочется. Ведь в обоих использованиях по условию нужно поменять значение или оставить прежнее. Вот это "оставить прежнее" это излишняя информация в коде.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405426
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Второй тренарный заборол. 280.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405434
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНо в этом дурацком конкурсе борьба за код, а не за производительность.
Однако ж, когда я пускаю у себя миллион out.print() - я не укладываюсь в 2 сек (с перенаправлением выхлопа в файл).
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405446
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно и первый тренарый забороть. Но выходит 281 :(
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class Main {
    public static void main(String[] x) throws Exception {
        int[] a = new int[201];
        int b = 0, v = 0, n = 2;
        while (b > -1) {
            b = System.in.read();
            if (n < 2 || 0 == (n = b - 10))
                if (b > 45) {
                    v *= 10;
                    v += b - 48;
                    n |= 1;
                } else if (b == 45)
                    n = -1;
                else if (n != 0) {
                    a[v * n + 100]++;
                    v = n = 0;
                }
        }
        while (b++ < 200)
            while (a[b]--> 0)
                System.out.print(b - 100 + " ");
    }
}
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405449
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевОднако ж, когда я пускаю у себя миллион out.print() - я не укладываюсь в 2 сек (с перенаправлением выхлопа в файл).
Локально тестируешь? Напиши Java обертку для запуска. Похоже у них там System.in и System.out быстрый.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405456
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
278 и ну его нафиг...
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405462
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, внесу свои 5 копеек.
А вот так можно заменить в Java?
было
Код: java
1.
   else if (n != 0) {


стало
Код: java
1.
   else if (n) {
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405465
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SQL2008,

Нельзя. Это же не JavaScript. Строгая типизация и всё такое.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405466
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

там еще и
Код: java
1.
2.
3.
int b=0,v=0,n=9;
for(;(b=System.in.read())>-1;){
b=System.in.read();


Но это наверное, ты и сам заметил.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405468
Фотография SQL2008
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz, жаль.
Я думал как в С++, допустима простая проверка на 0.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405474
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonAtum1
Код: java
1.
            Arrays.stream(s.split(" ")).mapToInt(Integer::parseInt).parallel().sorted().forEachOrdered(x->out.print(x + " "));


Не позорься.

Когда ты писал хакатоны со Streams - то это было респектабельно и красиво. И я тебя уважал. Но перфрманс - это явно не твоё.

split никогда не работал эффективно. Если ты хочешь производительность - то
никаких аллокаций и сплитов. Пили свой FSM и парсер текстового стрима.

Да дело не в перфомансе :)

Я еще раз повторюсь - идея была - решать все в функциональном стиле одной строкой .

и данное решение как раз их таких .

проблема возникает в ограничениях - и нужно искать компромисс - ужимать код , писать свои реализации итд ...

да, split - не быстр , хотя и обещали его ускорить ...

да можно написать свой парсер , и так и нужно делать .
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405475
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
277. Когда же меня наконец отпустит.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class Main {
    public static void main(String[] x) throws Exception {
        int[] a = new int[201];
        int b, v = 0, n = 2;
        while ((b = System.in.read()) > -1) {
            n = b == 10 ? 0 : n;
            if (n < 2)
                if (b > 45) {
                    v *= 10;
                    v += b - 48;
                    n |= 1;
                } else if (b > 44)
                    n = -1;
                else if (n != 0) {
                    a[v * n + 100]++;
                    v = n = 0;
                }
        }
        while (b++ < 200)
            while (a[b]--> 0)
                System.out.print(b - 100 + " ");
    }
}
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405481
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczМожно и первый тренарый забороть. Но выходит 281 :(
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
class Main {
    public static void main(String[] x) throws Exception {
        int[] a = new int[201];
        int b = 0, v = 0, n = 2;
        while (b > -1) {
            b = System.in.read();
            if (n < 2 || 0 == (n = b - 10))
                if (b > 45) {
                    v *= 10;
                    v += b - 48;
                    n |= 1;
                } else if (b == 45)
                    n = -1;
                else if (n != 0) {
                    a[v * n + 100]++;
                    v = n = 0;
                }
        }
        while (b++ < 200)
            while (a[b]--> 0)
                System.out.print(b - 100 + " ");
    }
}




Спасибо !

Вы сделали мой день !

:)
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405488
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
277

Это очень круто ...

по времени - и памяти - там у них виртуалка и часто в обсуждениях пишут такое - попробуйте запустить код в другое время ... бывает что не хватает каких то сотых секунд .
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405536
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Я еще раз повторюсь - идея была - решать все в функциональном стиле одной строкой .
Решение было в количестве символов. Но укладываясь в память.
Из-за двухбайтовой кодировки входной поток из 5 000 004 символов легко занимает 10 миллионов байт. Плюс сплиты и сортировка и jvm съела больше 16 Mb
Причем при этом Hotspot вылезает за установленные лимиты
параметры-Xmx12412K -Xss24K -XX:MaxMetaspaceSize=2648K Main <input2.txt >out.txt а java.exe взяла 20M (Без стримов остается внутри них).
Плюс куча импортов, да и превлатить исходный поток в поток (простим авторам их стеб)
А так да - решение получилось небольшое.
Код: java
1.
2.
3.
4.
5.
6.
7.
import java.io.*;
import java.util.*;
class Main {
    public static void main(String[] q) throws Exception {
      new BufferedReader(new InputStreamReader(System.in)).lines().skip(1).map(w->w.split(" ")).flatMap(Arrays::stream).mapToInt(Integer::parseInt).sorted().forEach(x->System.out.print(x + " "));
    }
}


Правда должен же быть способ потратить меньше букв на превращение в поток.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405537
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Exception лишний
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405539
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
261
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405562
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев261

Да. Все верно .

Спасибо.


Все это началось когда я посмотрел пару видео где. Декларировались следующее :

Век медленных компьютеров прошёл!

Мы будем писать код быстро и машины будут Египте же быстро исполнять!

А там где будут медленные места мы будем думать как их оптимизировать.


В этом подходе есть и минусы и плюсы:

Минусы в том что алгоритмы не оптимальные и на данном примере. Виден весь оверхед сплиты сортировка обычная не методом расчёта И так далее


Свомьрите сами написать алгоритм в олн строку занимает минуту . Написать эффективный


Алгоритм без ошибок куда дольше.

И вот нужно найти компромис .

Между эффективностью и скоростью разработки .


К тому же эффективный алгоритм сложен для понимания , через какое то время будет не легко понять что в нем происходит на уровне байт И так далее


Но именно это и есть программирование. И написанные алгоритмов .


Функциаональный стиль дал возможность легко понять что делает этот код он локаричен и краток но н эффективен. В производстве .


Вопрос философский где золотая середина ?
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405567
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но на сколь-ко-нибудь несортированных данных вылетает по времени.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405568
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Арсеньев261. Превратить через Files read all lines и path вроде как можно, в этой тебе как раз это выше в начале и обсуждалось.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405578
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про время был не прав - сам паузу влепил
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405582
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1,

Но это тоже букавки и в т.ч. в импорте.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405588
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Но в любом случае, если файл одна строка (две - первую пропускаем), split не укладывается в память
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405719
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно создать свой поток, но это опять много букв
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
StreamSupport.stream(Spliterators.spliteratorUnknownSize(
   new Iterator<String>() {
    int n = 1;
    public boolean hasNext() {
     return n>0;
    }
    public String next() {
     String s="";
     try {
      for (;(n = System.in.read()) > -1;) 
       if (n>32) s+=(char)n; else if (s!="") break;
     } catch (Exception e) {}
     return s;
    }
   }
   , 16 ), false).skip(1).filter(b->b!="").mapToInt(Integer::parseInt).sorted().forEach(b->System.out.print(b+" "));
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405779
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1Век медленных компьютеров прошёл!
С одной стороны оно так.
Миллион чисел сортируются за 16 ms.
А с другой
И этот же миллион чисел печатается за 4 699 ms.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405790
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевИ этот же миллион чисел печатается за 4 699 ms.+1, проблему можно решить перенаправлением потока в файл
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405797
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Usman+1, проблему можно решить перенаправлением потока в файл
По-моему это и есть "файл". На консоль на много дольше будет.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405801
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczUsman+1, проблему можно решить перенаправлением потока в файл
По-моему это и есть "файл". На консоль на много дольше будет.Если быть точнее, то так и есть.
Проблема с отрисовкой символов в окне, скролл, буферизация окна и пр. тормоза
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405808
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczUsman+1, проблему можно решить перенаправлением потока в файл
По-моему это и есть "файл". На консоль на много дольше будет.

у них по умолчанию чтение данных берется из файла input.txt

запись идет в output.txt

так что можно попробовать .


Это отличное решение !

можно так же указать размер - для параллельного сплитератора - ибо мы знаем сколько будет чисел.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
StreamSupport.stream(Spliterators.spliteratorUnknownSize(
   new Iterator<String>() {
    int n = 1;
    public boolean hasNext() {
     return n>0;
    }
    public String next() {
     String s="";
     try {
      for (;(n = System.in.read()) > -1;) 
       if (n>32) s+=(char)n; else if (s!="") break;
     } catch (Exception e) {}
     return s;
    }
   }
   , 16 ), false).skip(1).filter(b->b!="").mapToInt(Integer::parseInt).sorted().forEach(b->System.out.print(b+" "));
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405814
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Atum1у них по умолчанию чтение данных берется из файла input.txt
запись идет в output.txt

Это всего лишь имена :D. Они не дают никакого представления о том что происходит на физическом уровне. Факт в том что работа с System.in/System.out у них происходит быстрее чем банальный java Main < input.txt > output.txt на HDD, который без буфера в 2 секунды никак не укладывается. Скорее всего файлы лежат в памяти.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405866
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz Скорее всего файлы лежат в памяти.
А нафиг им творчество - логично что файлы создаются на рамдиске.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405872
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей АрсеньевА нафиг им творчество - логично что файлы создаются на рамдиске.
Выходит что буферизация в этих задачах не нужна.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39405880
Сергей Арсеньев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,

Им - нет. Наверное.
Ибо если ФС не игнорирует flush, то миллион out.print за 2 секунды, это 500K IOPS;
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39406821
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пятница. 275.
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39406829
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут сумму двух чисел настрочил. Но, к сожалению, 151 выходит. Слишком много на фоне 135 со сканером.
Код: java
1.
2.
3.
4.
5.
6.
7.
class Main {
    public static void main(String[] x) throws Exception {
        int b, n = 0, s = 0;
        while ((b = System.in.read()) > -1) n = b > 45 || (s += n) < 0 ? n * 10 + b - 48 : 0;
        System.out.print(s);
    }
}
...
Рейтинг: 0 / 0
Быстрое чтение и разбор файла
    #39407962
Atum1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЯ тут сумму двух чисел настрочил. Но, к сожалению, 151 выходит. Слишком много на фоне 135 со сканером.
Код: java
1.
2.
3.
4.
5.
6.
7.
class Main {
    public static void main(String[] x) throws Exception {
        int b, n = 0, s = 0;
        while ((b = System.in.read()) > -1) n = b > 45 || (s += n) < 0 ? n * 10 + b - 48 : 0;
        System.out.print(s);
    }
}




ААА !!! Это топ)
...
Рейтинг: 0 / 0
158 сообщений из 158, показаны все 7 страниц
Форумы / Java [игнор отключен] [закрыт для гостей] / Быстрое чтение и разбор файла
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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