|
|
||||||
Скорость чтения csv с разных носителей21.05.2020, 23:27. Показов 10523. Ответов 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, или смотреть надо только на скорость чтения, а на запись пофигу |
|
2737 / 894 / 331
Регистрация: 10.02.2018
Сообщений: 2,138
|
|||||||
| 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,554
|
|||||||||||||
| 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
|
|
|
фрилансер
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,419
|
|
| 08.06.2020, 09:37 | |
|
bedvit, std::string делает и позволяет делать всё абсолютно то же самое, что и "сырой" массив, нет никаких ограничений
bedvit, насчёт асинхронности: то есть, делается превентивный запрос блока из файла, а в то время, пока он вычитывается, работаем с предыдущим блоком - я правильно понимаю? в этом (в асинхронности) в нашем случае нет смысла, потому что поиск строки в озу (то есть, в уже загруженном блоке) , в блоке с детским размером 4096 происходит мгновенно по сравнению с чтением данных с диска. Можно оставить только синхронное чтение - это не повлияет на скорость работы алгоритма (какие-то там условные 0.001% ускорения не рассматриваем). Убираем асинхронность ->> сильно упрощаем логику кода Мне кажется, будет эффективнее заюзать OpenMP и начать искать сразу в нескольких равноудалённых местах файла
0
|
|
|
|
|||||||||||||||||||
| 08.06.2020, 10:43 [ТС] | |||||||||||||||||||
|
выравнивание адреса
Кроме того, кроме поиска там и формирование строки. это хоть небольшое, но время больше чем memcpy в рабочий буфер, поэтому профит есть.
0
|
|||||||||||||||||||
|
фрилансер
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,419
|
||
| 08.06.2020, 11:04 | ||
|
0
|
||
|
|
|
| 08.06.2020, 11:09 [ТС] | |
|
Алексей1153, да это обязательно.
Используется флаг FILE_FLAG_NO_BUFFERING в CreateFile() https://docs.microsoft.com/ru-... -buffering
0
|
|
|
фрилансер
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,419
|
||||||
| 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
|
||||||
|
фрилансер
6510 / 5772 / 1135
Регистрация: 11.10.2019
Сообщений: 15,419
|
||||||
| 08.06.2020, 11:28 | ||||||
|
пользоваться встроенными функциями поиска, однако, можно - но придётся задавать смещение начала. Это в функциях std::string предусмотрено
Добавлено через 1 минуту запись - тоже можно, если при этом не менять размер. buf_aligned - указатель на начало выровненного блока, nNumberOfBytesToRead - длина блока. Дальше всё как обычно
0
|
||||||
| 08.06.2020, 11:28 | |
|
Программа для чтения csv Скорость импорта CSV Bat - файл для чтения только одной строки из файла CSV Как правильно написать скрипт для чтения файла с расширением .csv(Excel) ? Скорость чтения/записи Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . .
Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
|
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг.
Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует.
В процессе разработки. . .
|
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
|
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации:
1. Вернуть возможность использования знаков | 1 l I;. . .
|
|
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С.
Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
|
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию?
Фраза «Любая достаточно развитая технология неотличима от магии». . .
|
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль?
Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
|
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология.
«Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
|