powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Как быстро читать большие тексовые файлы?
41 сообщений из 41, показаны все 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
Как быстро читать большие тексовые файлы?
    #39588733
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тут был продемонстрирован пример работы WinApi функции - ReadFile

Нет никакой сложности перевести на c++

Siemargl,

А чего такого??? Одним махом быстрее xD Всего лишь 0,8 сек. Быстренько отработали с массивом что надо, и закрыли.

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


В конце - то концов, Java этим не брезгует. И даже не подтирает за собою)))
...
Рейтинг: 0 / 0
Как быстро читать большие тексовые файлы?
    #39588736
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

Что тебе было непонятно в первом моем посте??

Для залетных поясню, что задача - практическая, а твое частное теоретическое решение для мелких файлов - оффтоп.

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

Я показал как читается файл размером 640 МБ (671 392 842 байт) за 0,8 секунд целиком .

И продолжаешь говорить что функция ReadFile для маленьких файлов ?

А ты смешной


Задача была - подсказать как можно быстро читать большие файлы.
Я показал, и не суть, что пример был на Delphi
...
Рейтинг: 0 / 0
Как быстро читать большие тексовые файлы?
    #39588742
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
НяшикТут был продемонстрирован пример работы WinApi функции - ReadFile

Нет никакой сложности перевести на c++

Siemargl,

А чего такого??? Одним махом быстрее xD Всего лишь 0,8 сек. Быстренько отработали с массивом что надо, и закрыли.

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


В конце - то концов, Java этим не брезгует. И даже не подтирает за собою)))

Подобный подход я тестировал во втором пункте, когда работал с памятью как с файлом (через объект QBuffer). В моем случае это оказался самый медленный вариант.

p.s. не думаю, что ребята из Qt налажали и как-то неудачно реализовали этот функционал. Скорее всего для моей задачи под win- платформой будет тоже самое.
...
Рейтинг: 0 / 0
Как быстро читать большие тексовые файлы?
    #39588743
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQL,

Тогда как ты объяснишь это, что на Delphi это очень быстро работает? Да по любому косяк ваших c++ кодов.

Даже и сомневаться не надо, и пусть там компания которая заслуживает почёта

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

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

Как знаешь.


Я сделал ещё тесты, на этот раз загрузил файлик размером 1,97 ГБ (2 120 760 783 байт)

Потратив на это 71,545101

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

Как знаешь.


Я сделал ещё тесты, на этот раз загрузил файлик размером 1,97 ГБ (2 120 760 783 байт)

Потратив на это 71,545101



У меня 16,2 ГБ за 161 секунду обрабатывались. Если у вас указано время 71,54510 в секундах, то не вижу сверхестественных достижений. Но сравнивать вашу производительность с моей глупо: у нас разные исходные данные, а можно сравнивать только результаты одинаковых задач.
...
Рейтинг: 0 / 0
Как быстро читать большие тексовые файлы?
    #39588779
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикReadLen:671392842 -- 640 МБ (671 392 842 байт)
ЗА 0,832291 секунд. WinApi функция - ReadFileНа такой скорости с HDD читаются только разреженные (sparse) файлы.
Даже для "обычных" SSD ~гигабайт в секунду - недостижимая фантастика.
...
Рейтинг: 0 / 0
Как быстро читать большие тексовые файлы?
    #39588783
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Я написал код, и указал ближайший файл большой, который помнил. Запустил, сделал скрин. И отправил сюда.


AlekseySQLУ меня 16,2 ГБ за 161 секунду обрабатывались. Если у вас указано время 71,54510 в секундах, то не вижу сверхестественных достижений. Но сравнивать вашу производительность с моей глупо: у нас разные исходные данные, а можно сравнивать только результаты одинаковых задач.

У тебя SSD а у меня HDD который работает с 2010 года по 10 - 15 часов.

По этому, для моего 71,54510 для файла 2 гб. Это нормально

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

То можно увидеть, что ReadFile из диска выжимает все соки, и читает на скорости 268 мб в секунду

...
Рейтинг: 0 / 0
Как быстро читать большие тексовые файлы?
    #39588785
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикЯ написал код, и указал ближайший файл большой, который помнил. Запустил, сделал скрин. И отправил сюда.Проблема микробенчмарков не в том, чтобы их выполнить, а в том, чтобы выполнить их корректно .

HDD чисто физически не может читать со скоростью 640/.8 ~= 800МБ/с.
Скорость линейного чтения любых HDD не выходит за 300МБ/с.
Скорость линейного чтения диска 2010 года, учитывая тогдашние плотности, будет на уровне 80-130МБ/с, в зависимости от ёмкости.

А вот для разреженного файла, где надо просто забить память нулями или для файла, который был закэширован (тем же superfetch) и гигабайт в секунду - нормально.
Вот только к чтению с диска это никак не относится.

P.S. SSD у AlekseySQL - меня пока жаба давит.
...
Рейтинг: 0 / 0
Как быстро читать большие тексовые файлы?
    #39588787
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

Ну, вроде максимальный порог 268 мб/сек мой хард может, и если диспетчер не врёт, то мой хард вот

https://market.yandex.ru/product/1012789/spec?track=tabs


Интерфейс
Подключение SATA 3Gbit/s
Внешняя скорость передачи данных 300 Мб/с
Внутренняя скорость передачи данных 972 Мбит/с

Временные характеристики
Среднее время доступа, чтение 8.9 мс
Среднее время доступа, запись 10.9 мс
Время доступа full stroke 21 мс
Время доступа track to track 2 мс
Среднее время задержки (Latency) 4.2 мс


К тому - же, замер у меня ювелирно точный, до 0,000000 секунд.
...
Рейтинг: 0 / 0
Как быстро читать большие тексовые файлы?
    #39588797
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
НяшикНу, вроде максимальный порог 268 мб/сек мой хард может, и если диспетчер не врёт, то мой хард вот
https://market.yandex.ru/product/1012789/spec?track=tabs
Интерфейс
Подключение SATA 3Gbit/s
Внешняя скорость передачи данных 300 Мб/с
Внутренняя скорость передачи данных 972 Мбит/с
Вы совершенно не то смотрите: 300МБайт/с - скорость обмена между кэшем диска и хостом. Т.е. память-память.
А вот 972МБит/с ~= 126МБайт/с это уже обмен данными "с пластинами" и эта цифра уже соответствует спецификациям WDC .
В точности вашей модели там нет, но есть аналогичная (по технологии и ёмкости).К тому - же, замер у меня ювелирно точный, до 0,000000 секунд.Это ещё одно заблуждение, которое проявится тогда, когда вы начнёте измерять интервалы на уровне долей миллисекунды.
...
Рейтинг: 0 / 0
Как быстро читать большие тексовые файлы?
    #39588846
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlekseySQLDima 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();



И никакого прироста производительности не замечено.
Зачем тут strncpy() ? Размер ты знаешь, поэтому достаточно memcpy()

Добавь внутрь этого цикла простейший счетчик и просто посчитай сколько строк в файле. Засеки время - получишь максимальную скорость чтения, а дальше думай как эту скорость не растерять.

Можно в два потока организовать обработку: читаешь кусок файла, если в конце обрезанная строка, то переносишь ее в следующий блок, текущий блок отдаешь на обработку второму потоку, в след. блок дочитываешь из файла и т.д.
Если порядок обработки строк не играет роли, то обрабатывающих потоков можно больше одного запустить.
...
Рейтинг: 0 / 0
Как быстро читать большие тексовые файлы?
    #39588901
AlekseySQL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Няшик]
У тебя SSD а у меня HDD который работает с 2010 года по 10 - 15 часов.
[quot]

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


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