Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как быстро читать большие тексовые файлы? / 25 сообщений из 41, страница 1 из 2
20.01.2018, 12:48
    #39587468
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
Написал чудесную программу, которая читает файлы размером ~500Мб (в файле ~ 10 млн строк ). Профайлер показал, что около 2/3 времени работы занимает I/O. Поэтому я попытался оптимизировать работу, протестировав 3 варианта программы (в скобках указано время выполнения программы в два потока):

1. Классический метод С++ std::ifstream + getline() ( 161 505, 160 876 )
2. Отображение ВСЕГО файла в память средствами Qt: QFile + QByteArray + QBuffer + Buffer.readLine() ( 273 488, 296 010 )
3. Map- инг файла в память средствами Qt: QFile + File.map() ( 157 117, 159 959 )

Однопоточный тест дает такие же результаты (но я изначально ориентируюсь на многопоточную работу).

У меня классический жесткий диск (не SSD) с буфером 64 Мб и поддержкой упреждающего чтения. Будет ли прирост производительности от SSD диска , если учесть, что на разделе очень много свободного места, а значит файлы не фрагментированы и следовательно работа идет через буфер диска?

Какие еще есть хитрые способы быстрого чтения больших файлов?
...
Рейтинг: 0 / 0
20.01.2018, 13:00
    #39587472
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
Тебе во первых нужно знать свое железо. И понимать где есть та верхняя граница
когда стоит остановиться и не мучать софт странными пожеланиями. Померяй скорость
копирования твоего файла в NULL или в /dev/null на линуксе. И отталкивайся
от этого числа. Для однопоточного приложения будет формула где это время разделится
на собственно I/O и работу одного раунда твоего парсера.
...
Рейтинг: 0 / 0
20.01.2018, 13:25
    #39587484
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
maytonТебе во первых нужно знать свое железо. И понимать где есть та верхняя граница
когда стоит остановиться и не мучать софт странными пожеланиями. Померяй скорость
копирования твоего файла в NULL или в /dev/null на линуксе. И отталкивайся
от этого числа. Для однопоточного приложения будет формула где это время разделится
на собственно I/O и работу одного раунда твоего парсера.

Выполнил замер такого куска кода (копирование с диска в оперативку и освобождение оперативки при выходе из функции):
Код: plaintext
1.
2.
3.
QFile File(NameFile);
if (!File.open(QIODevice::ReadOnly | QIODevice::Text))  return;
QByteArray Data = File.readAll();



Получил время выполнения 158 836 и 165 079 мсек . Значит быстрее этих цифр на текущей связке железо + ОС я не прыгну.

Тогда вопрос про SSD: будет прирост производительности при его использовании или ограничение идет на уровне интерфейса SATA?
...
Рейтинг: 0 / 0
20.01.2018, 14:12
    #39587499
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
AlekseySQLВыполнил замер такого куска кода (копирование с диска в оперативку
мопжежвашуять...цопи филе нуль
Код: plaintext
1.
2.
3.
1004842352 byte(s)
Текущее время: 19:06:54,13
Скопировано файлов:         1.
Текущее время: 19:07:02,81
Гигабайт за девять секунд. На терабайтном диске 5400 об/мин.
~110МБ/сек, что меньше ограничений SATA-1 (~150МБ/сек)
...
Рейтинг: 0 / 0
20.01.2018, 16:01
    #39587539
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
Basil A. SidorovAlekseySQLВыполнил замер такого куска кода (копирование с диска в оперативку
мопжежвашуять...цопи филе нуль
Код: plaintext
1.
2.
3.
1004842352 byte(s)
Текущее время: 19:06:54,13
Скопировано файлов:         1.
Текущее время: 19:07:02,81
Гигабайт за девять секунд. На терабайтном диске 5400 об/мин.
~110МБ/сек, что меньше ограничений SATA-1 (~150МБ/сек)


Что значат ваши замеры на древнем диске- непонятно.
...
Рейтинг: 0 / 0
20.01.2018, 19:43
    #39587597
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
Сходил я купил этот SSD. Выложил примерно 3500 кровных. Ну что вам сказать ребятки...

А все получилось! Ура!!!
Теперь тест чтения файлов с диска в память и ее освобождение выполняется за 41 395 и 41 146 мсек (примерно в 4 раза быстрее)!
...
Рейтинг: 0 / 0
20.01.2018, 19:49
    #39587599
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
AlekseySQLСходил я купил этот SSD. Выложил примерно 3500 кровных. Ну что вам сказать ребятки...

А все получилось! Ура!!!
Теперь тест чтения файлов с диска в память и ее освобождение выполняется за 41 395 и 41 146 мсек (примерно в 4 раза быстрее)!

А если еще и руками сделать.....
...
Рейтинг: 0 / 0
20.01.2018, 19:59
    #39587605
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
Можешь потестить мой block_read.h . Писал для быстрого чтения больших текстовых файлов. Топик тут

Примеры исходников там же можешь посмотреть uniq-crc.cpp
...
Рейтинг: 0 / 0
20.01.2018, 22:34
    #39587630
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
AlekseySQLСходил я купил этот SSD. Выложил примерно 3500 кровных. Ну что вам сказать ребятки...

А все получилось! Ура!!!
Теперь тест чтения файлов с диска в память и ее освобождение выполняется за 41 395 и 41 146 мсек (примерно в 4 раза быстрее)!
Дружище, это порочный путь.

Остался пустяк... написать в Requirements, что твой софт работает только на SSD...
...
Рейтинг: 0 / 0
20.01.2018, 22:52
    #39587640
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
maytonДружище, это порочный путь.

Остался пустяк... написать в Requirements, что твой софт работает только на SSD...

Именно поэтому я сначала тестил разные алгоритмы без покупки нового железа.

Кстати, за те самые 160 секунд у меня обрабатывались текстовые файлы общим весом 16,2 ГБ...
...
Рейтинг: 0 / 0
20.01.2018, 22:59
    #39587644
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
AlekseySQLЧто значат ваши замеры на древнем диске- непонятно.5400rpm это уже не древний диск - вы отстали от жизни.
Но главное даже не это:
Код: plaintext
1.
 REXX-Regina_3.9.1 5.00 5 Apr 2015
 Read 1004842352 bytes in 11.06 seconds
интерпретатор, заметьте
Код: txt
1.
2.
3.
4.
5.
6.
7.
8.
/* Stupid sample */
parse version version
say version
call time r
parse arg file
if stream(file,c,open read) = 'READY:'
then content = charin(file,,stream(file,c,query size))
call stream file,c,close
say 'Read' length(content) 'bytes in' format(time(r),,2) 'seconds'
...
Рейтинг: 0 / 0
20.01.2018, 23:34
    #39587663
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
Basil A. Sidorov5400rpm это уже не древний диск - вы отстали от жизни.
Но главное даже не это:
Код: plaintext
1.
 REXX-Regina_3.9.1 5.00 5 Apr 2015
 Read 1004842352 bytes in 11.06 seconds
интерпретатор, заметьте
Код: txt
1.
2.
3.
4.
5.
6.
7.
8.
/* Stupid sample */
parse version version
say version
call time r
parse arg file
if stream(file,c,open read) = 'READY:'
then content = charin(file,,stream(file,c,query size))
call stream file,c,close
say 'Read' length(content) 'bytes in' format(time(r),,2) 'seconds'


Опять что- то непонятное написано...
...
Рейтинг: 0 / 0
20.01.2018, 23:51
    #39587670
Basil A. Sidorov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
AlekseySQLОпять что- то непонятное написано...Чтение полугигабайта не должно занимать ни сто секунд, ни тридцать.
Даже если у вас нет твердотельного диска.
Практика показывает, что и не занимает.
...
Рейтинг: 0 / 0
21.01.2018, 09:03
    #39587736
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
Basil A. SidorovAlekseySQLОпять что- то непонятное написано...Чтение полугигабайта не должно занимать ни сто секунд, ни тридцать.
Даже если у вас нет твердотельного диска.
Практика показывает, что и не занимает.

Я читаю не полгигабайта, а 16,2 ГБ. Полгигабайта- размер одного файла.
...
Рейтинг: 0 / 0
22.01.2018, 16:07
    #39588516
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
AlekseySQLНаписал чудесную программу, которая читает файлы размером ~500Мб (в файле ~ 10 млн строк ). Профайлер показал, что около 2/3 времени работы занимает I/O.

Так программа, которая что-то читает, и так всегда будет висеть на одном IO.
Это нормально.

AlekseySQLКакие еще есть хитрые способы быстрого чтения больших файлов?


Никаких. Если не будешь читать побайтово, то все остальные способы будут примерно одинаково быстры.
...
Рейтинг: 0 / 0
22.01.2018, 17:46
    #39588599
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
Dima TМожешь потестить мой block_read.h . Писал для быстрого чтения больших текстовых файлов. Топик тут

Примеры исходников там же можешь посмотреть uniq-crc.cpp

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

А так, не сильно понятно чем отличается от классического map, который читает страницами по 4кБ. Например, у меня 4 кб вмещают примерно 80 строк текстового файла, так что если бы этот подход давал прирост в скорости чтения, то и на map было бы все видно.
...
Рейтинг: 0 / 0
22.01.2018, 18:29
    #39588612
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
AlekseySQLDima TМожешь потестить мой block_read.h . Писал для быстрого чтения больших текстовых файлов. Топик тут

Примеры исходников там же можешь посмотреть uniq-crc.cpp

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

А так, не сильно понятно чем отличается от классического map, который читает страницами по 4кБ. Например, у меня 4 кб вмещают примерно 80 строк текстового файла, так что если бы этот подход давал прирост в скорости чтения, то и на map было бы все видно.
Можно и map, только скорость не в этом. Отличие там не в чтении, а в разборе на строки. Там для разбиения на строки простейший поиск конца строки. В итоге получилось намного быстрее штатного fgets(). В топике вроде писал на сколько ускорилось, найти не смог.
...
Рейтинг: 0 / 0
22.01.2018, 19:44
    #39588655
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
MasterZivНикаких. Если не будешь читать побайтово, то все остальные способы будут примерно одинаково быстры.Не согласен.

Сколько ни тестили (и мы на этом форуме в том числе), стримы серьезно, чуть не в разы проигрывают даже fread.

Причина мне непонятна.
...
Рейтинг: 0 / 0
22.01.2018, 20:25
    #39588668
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
SiemarglMasterZivНикаких. Если не будешь читать побайтово, то все остальные способы будут примерно одинаково быстры.Не согласен.

Сколько ни тестили (и мы на этом форуме в том числе), стримы серьезно, чуть не в разы проигрывают даже fread.

Причина мне непонятна.

Хочешь сказать, что чтение средствами языка С (с использованием FILE) обгононяет чтение средствами языка С++ (с использованием ifstream и ofstream)?

Кстати, а чем система ввода/вывода С++ лучше, чем в С? Прохоренок, например, в своей книге говорит, что надо отдать предпочтение первой, не поясняя почему.
...
Рейтинг: 0 / 0
22.01.2018, 20:30
    #39588672
AlekseySQL
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
Dima TМожно и map, только скорость не в этом. Отличие там не в чтении, а в разборе на строки. Там для разбиения на строки простейший поиск конца строки. В итоге получилось намного быстрее штатного fgets(). В топике вроде писал на сколько ускорилось, найти не смог.

У меня именно с map поиск конца строки (в одной большой строке) используется:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
        QFile File(StringToQString(NameFile));
        if (!File.open(QIODevice::ReadOnly)) return;

        const char *p1 = (const char *) File.map(0, File.size());
        const char *p2;
        char buf[1024];

        while(true)
        {
            p2 = std::strchr(p1, '\n');
            if(p2 == NULL) break;

            strncpy(buf, p1, p2-p1+1);
            p1 = p2+1;
        }

        File.close();



И никакого прироста производительности не замечено.
...
Рейтинг: 0 / 0
22.01.2018, 22:20
    #39588719
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
Я просто оставлю это здесь...



Code :
Код: pascal
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.
program Project1;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  Winapi.Windows,
  System.SysUtils;

var
  StartTime, StopTime: Int64;
  iCounterPerSec: Int64;
  I: Integer;

  baf: UTF8String;

procedure BeginTime;
begin
  QueryPerformanceCounter(StartTime);
end;

procedure EndTime;
begin
  if QueryPerformanceCounter(StopTime) and QueryPerformanceFrequency
    (iCounterPerSec) then
    Writeln(Format('%.6f', [(StopTime - StartTime) / iCounterPerSec]));
end;

function FileSeek64(Handle: THandle; const Offset: Int64;
  Origin: Integer): Int64;
begin
  Result := Offset;
  Int64Rec(Result).Lo := SetFilePointer(Handle, Int64Rec(Result).Lo,
    @Int64Rec(Result).Hi, Origin);
  if (Int64Rec(Result).Lo = $FFFFFFFF) and (GetLastError <> 0) then
    Int64Rec(Result).Hi := $FFFFFFFF;
end;

function LoadFile(PHPFile: PWideChar): Int64;
var
  TFile: THandle;
  r: Integer;
begin
  TFile := FileOpen(PHPFile, $0000 or $0020);
  if TFile <> INVALID_HANDLE_VALUE then
  begin
    Result := FileSeek64(TFile, 0, 2);

    FileSeek64(TFile, 0, 0);
    SetLength(baf, Result);

    ReadFile(TFile, (@baf[1])^, Result, LongWord(r), nil);

    FileClose(TFile);
  end;
end;

procedure CloseFile;
begin
  SetLength(baf, 0);
end;

begin
  BeginTime;
  Writeln('ReadLen:',
    LoadFile('D:\S.T.A.L.K.E.R. - Shadow Of Chernobyl\gamedata.db4'));
  EndTime;
  CloseFile;
  Readln;

end.



ReadLen:671392842 -- 640 МБ (671 392 842 байт)

ЗА 0,832291 секунд. WinApi функция - ReadFile
...
Рейтинг: 0 / 0
22.01.2018, 22:21
    #39588721
Няшик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
Притом у меня обычный HDD 2010 года, дешёвого компьютера. И процессор Intel® Celeron® Processor E3300 (1M Cache, 2.50 GHz, 800 MHz FSB)
...
Рейтинг: 0 / 0
22.01.2018, 22:24
    #39588722
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
Няшик,

Изыди из топика!

Или на ++билдере перепиши =) (Тоже грех, но мелок)
...
Рейтинг: 0 / 0
22.01.2018, 22:25
    #39588723
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
Няшик,

Дополнительно замечу, что у местной богемы такой металлолом не наблюдается.
Секи тему!
...
Рейтинг: 0 / 0
22.01.2018, 22:30
    #39588726
Siemargl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как быстро читать большие тексовые файлы?
Няшик,

Еще за код - шоб тебе черти з'илы за попытку прочитать в стринг целый файл одним махом.....
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как быстро читать большие тексовые файлы? / 25 сообщений из 41, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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