1 | ||||||
Скорость чтения csv с разных носителей21.05.2020, 23:27. Показов 6368. Ответов 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
Скорость записи и чтения данных с разных источников - из реестра и Json Создание тестов на скорость чтения и скорость записи Так ли важна в реальной жизни скорость записи SSD, или смотреть надо только на скорость чтения, а на запись пофигу Программа для чтения csv |
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
21.05.2020, 23:38 | 2 |
Тем, что вы в своем коде не вырабатываете ресурс указанных устройств. Т.е. ваш код не создает достаточную для проявления разницы нагрузку.
0
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
||||||
22.05.2020, 01:11 | 4 | |||||
Скорость упирается в ваш алгоритм, видимо.
Добавлено через 2 минуты
Читайте сразу большими блоками, например по 16 мегабайт за раз, и скорость должна вырасти.
0
|
22.05.2020, 10:48 [ТС] | 5 |
Про блоки, можно подумать. Здесь к размышлению, то, что строка может быть и первой и последней и файл может быть 1 МБ и 10 ГБ. Еще по 16 мегабайт, нужно сшивать строки на границах, т.к. строк не ровное кол-во влезает и т.д.
Мне, как непосвященному в тонкости низкоуровнего железа, остается непонятен следующий момент: пусть я читаю построчно, пусть скорость чтения блоками будет быстрее, но почему на разных дисках одинаковое время выполнения (думаю и с блоками будет похожая ситуация?) Куда я упираюсь при чтении строками, память, кеш, ЦП на порядки быстрее работают, где очередь? почему SSD мне дает такую же скорость как HDD?
0
|
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
|
|
22.05.2020, 12:12 | 9 |
Да, и прочие fstream-ы.
Добавлено через 8 минут Сравнить содержимое файлов между собой, и если оно совпадает, то вывести на экран имена этих файлов
1
|
3437 / 2816 / 1249
Регистрация: 29.01.2016
Сообщений: 9,426
|
||||||
22.05.2020, 12:26 | 11 | |||||
Кликните здесь для просмотра всего текста
0
|
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
22.05.2020, 16:31 | 12 |
тормоз - тоже механизм.
ну например... под windows можно отмаппить весь файл на память, и тогда скорость чтения вырастит во многие разы.
1
|
22.05.2020, 23:46 [ТС] | 13 | |||||
Мое почтение, джентльмены.
Тестовый стенд: Кликните здесь для просмотра всего текста
Операционная система Microsoft Windows 10 Professional
Тип ЦП QuadCore AMD Phenom II X4 Black Edition 955, 3200 MHz (16 x 200) Системная плата Asus M4A89GTD Pro (2 PCI, 1 PCI-E x1, 1 PCI-E x4, 2 PCI-E x16, 4 DDR3 DIMM, Audio, Video, Gigabit LAN, IEEE-1394) Чипсет системной платы AMD 890GX, AMD K10 Системная память 8192 МБ (DDR3-1333 DDR3 SDRAM) DIMM1: Kingston 99U5474-028.A00LF 4 ГБ DDR3-1333 DDR3 SDRAM (9-9-9-24 @ 666 МГц) (8-8-8-22 @ 609 МГц) (7-7-7-20 @ 533 МГц) (6-6-6-17 @ 457 МГц) DIMM2: Kingston 99P5458-005.A00LF 4 ГБ DDR3-1333 DDR3 SDRAM (9-9-9-24 @ 666 МГц) (8-8-8-22 @ 609 МГц) (7-7-7-20 @ 533 МГц) (6-6-6-17 @ 457 МГц) Хранение данных Дисковый накопитель KINGSTON SV300S37A120G (120 ГБ, SATA-III) Дисковый накопитель WDC WD10EACS-00ZJB0 (1000 ГБ, SATA-II) +CSV-файла размером 1ГБ (длина строки в тесте 200 символов, но может быть разная, но не более 33000 символов) Код (Release): Кликните здесь для просмотра всего текста
Результаты (запуск exe) SSD KINGSTON SV300S37A120G (120 GB, SATA-III): std::getline + Find: Time - 18.017000 SSD KINGSTON SV300S37A120G (120 GB, SATA-III): std::getline: Time - 16.798000 HDD WDC WD10EACS-00ZJB0 (1000 GB, SATA-II): std::getline: Time - 16.791000 SSD KINGSTON SV300S37A120G (120 GB, SATA-III): fgets: Time - 9.222000 HDD WDC WD10EACS-00ZJB0 (1000 GB, SATA-II): fgets: Time - 8.974000 Выводы: 1. Поиск нужных символов (подстроки) в строке на общее время выполнение влияет мало. 2. Скорость чтения всех строк не зависит от скорости самого диска (HDD или SSD), даже с применением Си-функций 3. Си-функций работают в 2 раза быстрее std:: Опять не вырабатываем ресурс указанных устройств.
0
|
693 / 303 / 99
Регистрация: 04.07.2014
Сообщений: 846
|
|
22.05.2020, 23:54 | 15 |
Есть ещё кэш ОС. Поэтому перед тестом скорости обработки файла. Надо проработать с файлами размером больше, чем ОЗУ
0
|
1487 / 1414 / 240
Регистрация: 19.02.2010
Сообщений: 3,915
|
|
23.05.2020, 00:02 | 16 |
Не читайте построчно.
Используйте специфические для ОСи функции чтения файла. Т.е. под виндой - её обычный ReadFile(), но асинхронный (overlapped), чтобы получить возможность один кусок файла читать, и одновременно обрабатывать ранее прочитанный. Плюс при открытии файла через CreateFile() есть ещё флажок FILE_FLAG_NO_BUFFERING (чтобы лишний раз не кэшировать данных). Соответственно, вместо fgets() нужно будет написать свой код поиска концов строк в буфере.
1
|
18840 / 9839 / 2408
Регистрация: 30.01.2014
Сообщений: 17,280
|
|
23.05.2020, 00:11 | 17 |
У современных накопителей есть кеш, обычно он больше 8 мегабайт. Если вы не пробуете читать больше данных за раз, то разницу никогда не увидите. Я вам не зря же выше сказал, чтобы вы делали буфер чтения не менее 16 Мб.
В вашем тесте как минимум кардинально различается работа с памятью. В "Си" варианте вы читаете в заранее выделенную память на стеке, а в "С++" варианте память постоянно выделяется динамически. Это наверняка вносит существенный вклад в разброс производительности. Поэтому выводы на основе этого теста делать нельзя.
0
|
23.05.2020, 12:45 [ТС] | 19 |
nd2, тоже так подумал, в след.тесте внесу правки.
VTsaregorodtsev, интересная информация, теперь надо нагуглить как их использовать. Я так понимаю вместе нельзя, только асинхронность или только кеширование. Понять, что будет эффективнее. AlexVRud, есть файл на 10 ГБ., больше оперативки. Но если читать построчно, то разницы нет. DrOffset, буфер в 16 МБ, пока не пойму что это даст. Буфер есть у накопителя, но скорость его подгрузки предполагаю зависит от скорости чтения с диска. Сам файл у меня явно больше этого кеша. Да в СИ варианте буфер на стеке, и в stl каждый раз создаем строку в куче и подозреваю ее из кучи удаляем. Предполагаю это основная причина разницы в скорости. У меня строка не может быть больше 32КБ. Не будет ли буфер в 16 МБ тратой ресурсов и времени? Представляется, что вариант от VTsaregorodtsev, с чтением в буфер по 32 КБ, и далее с поиском разделителя строки, будет самый быстрый, мнения? Такого еще не пилил, выходит если разделитель найден, ищем следующий и так до последнего. Далее грузим в буфер другие 32КБ, начиная с места последнего разделителя? Хорошо бы примерчик глянуть аналогичный. Verevkin, да нет ничего секретного, текст 5.2 млн строк в среднем по 200 символов. Могу накидать генератор, или можно использовать выше от nd2. Файл не всегда будет 1ГБ есть и 10. Да и смысл его весь грузить в оперативку, если нам нужна будет вторая строка?
0
|
Заблокирован
|
|
23.05.2020, 12:53 | 20 |
Дык тыж тестируешь скорость работы накопителей. Или передумал уже? Исключи анализ данных при чтении для чистоты эксперимента. Это независимая подзадача, которую можно гнать в побочном треде.
0
|
23.05.2020, 12:53 | |
23.05.2020, 12:53 | |
Помогаю со студенческими работами здесь
20
Скорость импорта CSV Bat - файл для чтения только одной строки из файла CSV Как правильно написать скрипт для чтения файла с расширением .csv(Excel) ? Скорость чтения/записи скорость чтения - копейки Скорость чтения DVD Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |