powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как быстро читать большие тексовые файлы?
25 сообщений из 41, страница 1 из 2
Как быстро читать большие тексовые файлы?
    #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
Как быстро читать большие тексовые файлы?
    #39587472
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тебе во первых нужно знать свое железо. И понимать где есть та верхняя граница
когда стоит остановиться и не мучать софт странными пожеланиями. Померяй скорость
копирования твоего файла в NULL или в /dev/null на линуксе. И отталкивайся
от этого числа. Для однопоточного приложения будет формула где это время разделится
на собственно I/O и работу одного раунда твоего парсера.
...
Рейтинг: 0 / 0
Как быстро читать большие тексовые файлы?
    #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
Как быстро читать большие тексовые файлы?
    #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
Как быстро читать большие тексовые файлы?
    #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
Как быстро читать большие тексовые файлы?
    #39587597
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сходил я купил этот SSD. Выложил примерно 3500 кровных. Ну что вам сказать ребятки...

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

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

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

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

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

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

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

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

Кстати, за те самые 160 секунд у меня обрабатывались текстовые файлы общим весом 16,2 ГБ...
...
Рейтинг: 0 / 0
Как быстро читать большие тексовые файлы?
    #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
Как быстро читать большие тексовые файлы?
    #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
Как быстро читать большие тексовые файлы?
    #39587670
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLОпять что- то непонятное написано...Чтение полугигабайта не должно занимать ни сто секунд, ни тридцать.
Даже если у вас нет твердотельного диска.
Практика показывает, что и не занимает.
...
Рейтинг: 0 / 0
Как быстро читать большие тексовые файлы?
    #39587736
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Basil A. SidorovAlekseySQLОпять что- то непонятное написано...Чтение полугигабайта не должно занимать ни сто секунд, ни тридцать.
Даже если у вас нет твердотельного диска.
Практика показывает, что и не занимает.

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

Кстати, а чем система ввода/вывода С++ лучше, чем в С? Прохоренок, например, в своей книге говорит, что надо отдать предпочтение первой, не поясняя почему.
...
Рейтинг: 0 / 0
Как быстро читать большие тексовые файлы?
    #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
Как быстро читать большие тексовые файлы?
    #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
Как быстро читать большие тексовые файлы?
    #39588721
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Притом у меня обычный HDD 2010 года, дешёвого компьютера. И процессор Intel® Celeron® Processor E3300 (1M Cache, 2.50 GHz, 800 MHz FSB)
...
Рейтинг: 0 / 0
Как быстро читать большие тексовые файлы?
    #39588722
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

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

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

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

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


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