Является ли проблематичным чтение / запись данных небольшого размера? - PullRequest
3 голосов
/ 08 июня 2019

Я использую чтение / запись для чтения / записи из / на обычные файлы локального диска.

Я должен прочитать / записать небольшое количество данных. например

read(fd, buf, 15)
write(fd, buf, 39);

И мне сказали, что я должен избегать небольшого объема чтения / записи данных, когда кто-то просматривает мой запрос на извлечение.

Они сказали: например, я должен выделить большую память, например 4 КБ, и сначала скопировать маленькие данные в большую память, и записать большую память один раз вместо записи маленьких данных много раз. И я также должен прочитать данные размером 4 Кб и сохранить их в большой памяти, тогда я смогу использовать эту большую память.

Но я понимаю, что когда я пишу небольшие данные, я пишу в кеш страниц (?), Чтобы ядро ​​позаботилось о памяти? Когда он станет достаточно большим, ядро ​​запишет на диск?

Я правильно понял? Стоит ли избегать чтения / записи небольших данных?

Ответы [ 2 ]

4 голосов
/ 08 июня 2019

Я правильно понял? Следует ли мне избегать чтения / записи небольших данных?

Вы думаете правильно, и нет, нет необходимости избегать чтения / записи небольших данных.

Подсистема ввода / вывода уже обеспечивает буфер чтения размером BUFSIZ байтов (8192 байта в Linux и 512 байтов в Windows) (#define сместился в glibc за последний год, первоначально полученный из _IO_BUFSIZE затем _LIO_BUFSIZ, а теперь просто BUFSIZ в источнике glibc)

Вот коммит glibc, переходящий от _IO_BUFSIZ к простому BUFSIZ Механическое удаление IO псевдонимов имен для типов и констант (ср., 7 февраля 2018 г.).

Так что не имеет значения, если вы читаете однобайтовые или 8192 байты (в Linux) или 512 байты (в Windows), никакого снижения производительности не происходит. Буфер ввода-вывода уже был заполнен BUFSIZ байтами (или числом байтов до тех пор, пока не встретится EOF, если файл содержит менее BUFSIZ байтов) в вашем первом запросе данных из файла. Таким образом, вы читаете напрямую из буфера чтения в памяти, и при небольших операциях чтения производительность не снижается.

Записи обрабатываются аналогичным образом и не записываются на диск до тех пор, пока буфер записи не заполнится (или не будет вызван syncfs или fsync), в результате чего все данные буферизованного файла будут записаны в базовую файловую систему.

0 голосов
/ 08 июня 2019

Проблематично ли чтение / запись данных небольшого размера?

Если вам нужно только для чтения / записи небольшого количества данных, чтение / запись больше - пустая трата времени.

Если вам нужно читать / записывать большое количество данных, чтение / запись множества небольших фрагментов означает, что вы платите много времени за переключение между пользовательским пространством и ядром много раз (независимо от того, переключаются ли они из-за вызовов API ядра или переключатели, вызванные такими вещами, как ошибки страниц). Является ли это проблематичным, зависит от сценария - например, для грубого прототипа, который предназначен для выполнения только в 3 раза, это не имеет значения, но для высокопроизводительного производственного программного обеспечения, которое тратит много времени на ввод-вывод, это может быть нежелательным (особенно сейчас, когда смягчение последствий Spectre и Meltdown увеличивает затраты на переключение, и особенно если нет другой причины, например, «сопровождение кода», которая оправдывает дополнительные издержки).

...