|
|
||||||
Скорость чтения csv с разных носителей21.05.2020, 23:27. Показов 9912. Ответов 148
Метки нет (Все метки)
Добрый день, джентльмены.
На днях набросал простой код поиска нужной строки в CSV-файле, см. под спойлером Кликните здесь для просмотра всего текста
Сегодня протестировал работу на з-х накопителях: HDD WDC WD10EACS-00ZJB0 (1000 ГБ, SATA-II) HDD WDC WD5000AAKX-001CA0 (500 ГБ, 7200 RPM, SATA-III) SSD KINGSTON SV300S37A120G (120 ГБ, SATA-III) В итоге время обработки CSW-файла размером 1ГБ у всех примерно одинаковое, что стало для меня откровением. Я предполагал, что в данном коде узкое место скорость чтения с накопителя. Чем можно объяснить такой результат теста?
0
|
||||||
| 21.05.2020, 23:27 | |
|
Ответы с готовыми решениями:
148
Создание тестов на скорость чтения и скорость записи Так ли важна в реальной жизни скорость записи SSD, или смотреть надо только на скорость чтения, а на запись пофигу |
|
2736 / 891 / 331
Регистрация: 10.02.2018
Сообщений: 2,128
|
|||||||
| 27.05.2020, 10:36 | |||||||
|
bedvit, в некоторых источниках пишут, что адрес принимающего буфера то же должен быть выровнен по размеру сектора (File Buffering)
1
|
|||||||
|
|
||||||
| 27.05.2020, 12:27 [ТС] | ||||||
|
Ygg, протестировал, разницы в скорости нет.
Добился асинхронности, добавив еще буфер. Скорость в ущерб памяти (выиграл 0,05 сек. на простом алгоритме, далее. думаю, выигрыш должен быть больше) Функция подсчета строк в файле csv (ansi) - 2.54 сек. на 1ГБ.
4 млн. строк Добавлено через 19 минут С этим вариантом более-менее ясно. Остался еще вариант - через MMF (memory mapped files). Навряд ли быстрее, но видятся и плюсы - единое адресное пространство, не нужно сшивать строки из разных буферов и хранить где-то предыдущий буфер (если кусок найденной строки там остался), если сделать MMF сразу на весь файл. Однако, что будет с память, как это будет перевариваться? Не работал с MMF, возможно у кого-то есть наработки или информация.
0
|
||||||
|
264 / 153 / 33
Регистрация: 29.06.2019
Сообщений: 1,549
|
|||||||||||||
| 27.05.2020, 15:51 | |||||||||||||
|
mmap Tutorial Системные вызовы mmap(), munmap() кратко здесь на stackoverflow - mmap() vs. reading blocks - статья была... - но у меня тесты не проходили, т.к.
p.s. встречался и вариант boost Memory-mapped files using the boost library Headers
код в сети был
... так я это и забросила, когда поняла, что не для моих мелких файлов это дело выгодно... p.p.s и здесь на кибере есть MMF - и без того нерабочего под винду заголовочника - он, наверно, под линукс был нужен (тот заголовочник)
0
|
|||||||||||||
|
|
|
| 01.06.2020, 00:14 [ТС] | |
|
Есть ли возможность узнать хеширован файл системой или нет? Логично предположить, что если хеширован, читать из хеша, нет отключать хеширование и читать с диска, т.е. выходит, таким образом - самый быстрый способ чтения.
0
|
|
|
|
||||||
| 04.06.2020, 18:16 [ТС] | ||||||
|
Результат на примере функции поиска строки в CSV, по подстроке (конструктивные предложения принимаются)
Особенности реализации: 1.Асинхронность 2.Возможность отключения системного кеширования. 3.Возможность вывода всех найденных строк (или первой) 4.Строка выводится вся, в т.ч. с разделителями 5.Адрес принимающего буфера и рабочего выровнен по размеру сектора/страницы - 4096 байт 6.Использована структура _ULARGE_INTEGER, что прибавило 0,5 сек к времени выполнения (возможно чем-то заменить?) 7.В силу малого количества строк использовал std::string (думаю на скорости это не скажется) Кликните здесь для просмотра всего текста
Тайминги на 1ГБ (4 млн.строк) и 10ГБ (40 млн.строк) на двух дисках (HDD и SSD): SSD: 1GB: NO_BUF: Time - 2.548000 SSD: 1GB: Time - 3.579000 SSD: 1GB: Хеширован: Time - 1.316000 SSD: 10GB: NO_BUF: Time - 25.452000 SSD: 10GB: Time - 35.779000 HDD: 1GB: NO_BUF: Time - 17.108000 HDD: 1GB: Time - 17.166000 HDD: 1GB: Хеширован: Time - 1.317000 HDD: 10GB: NO_BUF: Time - 206.368000 HDD: 10GB: Time - 219.626000 Выводы: 1.Если файл не влезает в системный кеш, отключение кеширования положительно влияет на тайминг, если влезает кеширование серьезно ускоряет процесс. 2.Ответом по теме (почему скорости равные на разных носителях) - кеширование системой рабочего файла. Как видим в тестах при кешировании результат очень похож, хотя по факту скорость чтения с двух носителей различается на порядок. 3.Асинхронное чтение явно ускоряет процесс. Добавлено через 14 минут 4. При документированной скорости чтения SSD - 450 Мб/с, 10 ГБ читается 22,2 сек, что близко к скорости функции (25,45 сек). Возможно ли оптимизировать эти 3 сек. - наверное да, но вот нужно ли. Добавлено через 53 минуты 5. Пока остановился на чтение блоками, кратно степени двойки - по 16 Мб. Обычно такой физический кеш в hdd. Есть, правда уже и 32, 64 и т.д.
0
|
||||||
|
Just Do It!
|
|||||||
| 07.06.2020, 17:09 | |||||||
|
bedvit,
то решил проверить ваше утверждение на вашем же тесте:
bedvit, извините, но у вас фейк.
0
|
|||||||
|
|
||||||
| 07.06.2020, 19:33 [ТС] | ||||||
|
XLAT, это старый тест, fgets() - тоже медленно.
вот тестовый стенд:
теперь нужно найти 40 млн. строку (считаем от началf файла), теперь давайте сравним с вашим.
0
|
||||||
|
|
|
| 08.06.2020, 09:08 [ТС] | |
|
XLAT, я вам ничего не предлагаю, я лишь думаю что работа через указатели напряму с памятью быстрее, чем работа с классом строк std. По крайней мере не медленнее. Здесь и адресная арифметика, и в любое место или с нужного места я могу писать то что мне захочется. Std здесь меня ограничивает. Зачем он мне?
1
|
|
|
фрилансер
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
|
|
| 08.06.2020, 09:37 | |
|
bedvit, std::string делает и позволяет делать всё абсолютно то же самое, что и "сырой" массив, нет никаких ограничений
bedvit, насчёт асинхронности: то есть, делается превентивный запрос блока из файла, а в то время, пока он вычитывается, работаем с предыдущим блоком - я правильно понимаю? в этом (в асинхронности) в нашем случае нет смысла, потому что поиск строки в озу (то есть, в уже загруженном блоке) , в блоке с детским размером 4096 происходит мгновенно по сравнению с чтением данных с диска. Можно оставить только синхронное чтение - это не повлияет на скорость работы алгоритма (какие-то там условные 0.001% ускорения не рассматриваем). Убираем асинхронность ->> сильно упрощаем логику кода Мне кажется, будет эффективнее заюзать OpenMP и начать искать сразу в нескольких равноудалённых местах файла
0
|
|
|
|
|||||||||||||||||||
| 08.06.2020, 10:43 [ТС] | |||||||||||||||||||
|
выравнивание адреса
Кроме того, кроме поиска там и формирование строки. это хоть небольшое, но время больше чем memcpy в рабочий буфер, поэтому профит есть.
0
|
|||||||||||||||||||
|
фрилансер
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
|
||
| 08.06.2020, 11:04 | ||
|
0
|
||
|
|
|
| 08.06.2020, 11:09 [ТС] | |
|
Алексей1153, да это обязательно.
Используется флаг FILE_FLAG_NO_BUFFERING в CreateFile() https://docs.microsoft.com/ru-... -buffering
0
|
|
|
фрилансер
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
|
||||||
| 08.06.2020, 11:21 | ||||||
|
bedvit, как-то так
само собой, нельзя будет допускать переаллокации s, иначе buf_aligned станет невалиден то есть, std::string в данном случае используется полностью обычный блок памяти, выделенный new плюс единственный - не нужно заниматься ручным выделением памяти и освобождением Добавлено через 1 минуту наверное, можно что-то поколдовать над аллокатором, но я пока ещё не умею ![]() https://en.cppreference.com/w/... sic_string https://en.cppreference.com/w/cpp/memory/allocator После сильного колдунства никаких ручных выравнивание делать не придётся. Но это уже лишнее, так как всё равно используем класс в качестве массива на куче P.S. имя надо задать не "s", а что-то более говорящее. У меня - для примера
2
|
||||||
|
фрилансер
6495 / 5724 / 1133
Регистрация: 11.10.2019
Сообщений: 15,286
|
||||||
| 08.06.2020, 11:28 | ||||||
|
пользоваться встроенными функциями поиска, однако, можно - но придётся задавать смещение начала. Это в функциях std::string предусмотрено
Добавлено через 1 минуту запись - тоже можно, если при этом не менять размер. buf_aligned - указатель на начало выровненного блока, nNumberOfBytesToRead - длина блока. Дальше всё как обычно
0
|
||||||
| 08.06.2020, 11:28 | |
|
Программа для чтения csv Скорость импорта CSV Bat - файл для чтения только одной строки из файла CSV Как правильно написать скрипт для чтения файла с расширением .csv(Excel) ? Скорость чтения/записи Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Море в объективе
kumehtar 06.07.2026
Хотел написать много проникновенных слов, но передумал.
Оно само - говорит.
Кто слышит тот слышит.
|
Doom для терминала без стрельбы и монстров. 3D Raycasting на ascii.
dcc0 05.07.2026
Попросил нейронную сеть deepai. org написать рейкастинг 3D с библиотекой ncurses для Linux. Чтобы можно было
ходить на стрелочки. Чтобы стены были отрисованы символами. Справилась.
Первый вариант. . .
|
Установка статуса документа по условию
Maks 05.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "НарядПутевка" разработанного в КА2.
Задача: в табличной части "Материалы" документа при записи автоматически устанавливать статус. . .
|
Сезонность и суточность закисления почв
anaschu 04.07.2026
200 часов это все равно моловато. Есть ситуации, но нестандартные, когда смена происходит за 5 лет.
Но обычно это 50 лет и более.
Наверное, закисление почвы происходит сезонно в средней. . .
|
|
В чем ценность человеческого опыта в глобальном смысле?
kumehtar 03.07.2026
Возможно, ценность человека не в том, что он однажды достигает мудрости, а в том, что он становится носителем карты пути. Он знает не только истину, но и последовательность внутренних изменений,. . .
|
интеграция AnyLogic с самописным REST API и переход на Odoo
anaschu 03.07.2026
Успешная интеграция AnyLogic с самописным REST API и переход на промышленную Odoo WMS
Сегодня проделал огромный путь от простой симуляции физических процессов до построения полноценной. . .
|
Поиск всех путей на ориентированном графе. Linux
dcc0 02.07.2026
Переработка старого кода из моей статьи.
Через несколько переработок от PHP кода к C89 (надеюсь, 89).
Но довольно запутанно получилось. Код для Linux.
Но если убрать time и то, что с ним. . .
|
Сам себя обучал rest api
anaschu 02.07.2026
Педагогический лайфхак: Почему чистый REST API для ученика намного круче, чем готовые библиотеки
Когда мы отказались от капризного JAR-файла AnyLogic и переписали код на стандартный HttpClient,. . .
|