RAM-диск медленнее, чем диск?
Программа Python, которую я создал, ограничена IO. Большая часть времени (более 90%) проводится в одном цикле, который повторяется ~10000 раз. В этом цикле данные ~100 КБ генерируются и записываются во временный файл; это тогда прочитано назад другой программой и статистикой об этих данных, собранных. Это единственный способ передать данные во вторую программу.
Из-за того, что это является главным узким местом, я подумал, что перемещение местоположения временного файла с моего основного жесткого диска на (~40 МБ) RAM-диск (внутри более 2 ГБ свободной ОЗУ) значительно увеличит скорость ввода-вывода для этого файла и, таким образом, уменьшит время выполнения. Тем не менее, я получил следующие результаты (каждый в среднем за 20 прогонов):
- Тестовые данные 1: без RAMdisk - 72,7 с, с RAMdisk - 78,6 с
- Тестовые данные 2: без RAMdisk - 223,0 с, с RAMdisk - 235,1 с
Казалось бы, RAMdisk медленнее, чем мой HDD.
Что может быть причиной этого?
Есть ли какая-либо другая альтернатива использованию RAMdisk для более быстрого ввода-вывода файла?
6 ответов
Ваша операционная система почти наверняка уже буферизует / кеширует записи на диск. Не удивительно, что RAM-диск так близок по производительности.
Не зная точно, что вы пишете или как, мы можем предложить только общие предложения. Некоторые идеи:
Если у вас 2 ГБ ОЗУ, возможно, у вас приличный процессор, поэтому вы можете записать эти данные в файловую систему со сжатием. Это будет обменивать операции ввода-вывода на процессорное время, предполагая, что ваши данные поддаются этому.
Если вы делаете много небольших записей, объедините их, чтобы писать большие фрагменты одновременно. (Можем ли мы увидеть исходный код?)
Вы удаляете файл размером 100 КБ после использования? Если вам это не нужно, то удалите его. В противном случае ОС может быть вынуждена сбросить ее на диск.
Я знаю, что Windows очень агрессивно относится к кешированию дисковых данных в оперативной памяти, и 100K легко поместится. Записи идут непосредственно в кеш, а затем, возможно, записываются на диск через неблокирующую запись, что позволяет программе продолжаться. RAM-диск, вероятно, не будет поддерживать неблокирующие операции, потому что он ожидает, что эти операции будут быстрыми и не стоит беспокоиться.
Сокращая объем памяти, доступной для программ и кэширования, вы увеличите объем дискового ввода-вывода для подкачки, хотя бы незначительно.
Это все домыслы с моей стороны, так как я не знаком с ядром или драйверами. Я также предполагаю, что Linux будет работать аналогично.
Можете ли вы записывать данные партиями, а не по одному элементу за раз? Вы кешируете ресурсы, такие как дескрипторы открытых файлов и т. Д., Или очищаете их? Если ваш диск записывает блокировку, можете ли вы использовать фоновые потоки для насыщения ввода-вывода, не влияя на производительность вычислений.
Сначала я посмотрю на оптимизацию записи на диск, а затем посмотрю на более быстрые диски.
В своих тестах я обнаружил, что не только размер пакета влияет на общую производительность, но и сам характер данных. Мне удалось получить в 5 раз лучшее время записи по сравнению с твердотельным накопителем только в одном сценарии: запись 100-Мбайт предварительно подготовленного массива случайных байтов на диск ОЗУ. Запись более "предсказуемых" данных, таких как буквы "aaa" или текущая дата-время, дает совершенно противоположные результаты - SSD всегда быстрее или одинаковее. Поэтому я предполагаю, что операционная система (в моем случае Win 7) выполняет много операций кэширования и оптимизации. Похоже, что наиболее затруднительным для RAM-диска является случай, когда вы выполняете много маленьких записей вместо нескольких больших, а RAM-диск отлично справляется с записью большого количества трудно сжимаемых данных.
У меня был такой же ошеломляющий опыт, и после многих попыток я понял это. Когда ramdisk отформатирован как FAT32, тогда, хотя тесты показывают высокие значения, реальное использование на самом деле медленнее, чем в отформатированном NTFS SSD. Но виртуальный диск в формате NTFS быстрее в реальной жизни, чем SSD.
Присоединяюсь к людям у которых проблемы со скоростью RAM диска (только на винде).
SSD, который у меня есть, может записывать 30 ГБ (в одном большом блоке, дамп массива ОЗУ 30 ГБ) со скоростью 550 МБ/с (около 56 секунд для записи 30 ГБ)... это если запись запрашивается в одном источнике кодовое предложение.
RAM-диск (imDisk), который у меня есть, может записывать 30 ГБ записи (в одном большом блоке сбрасывать 30 ГБ RAM ARRAY) со скоростью чуть менее 100 МБ/с (около 5 минут и 13 секунд для записи 30 ГБ). ..это если писать просят в одном предложении исходника.
Я также провел еще один тест ОЗУ: из исходного кода выполните последовательную прямую запись (один байт на проход цикла исходного кода) в массив ОЗУ объемом 30 ГБ (у меня 64 ГБ ОЗУ), и я получаю скорость около 1,3 ГБ / с (1298). МиБ в секунду).
Почему, черт возьми, (в Windows) RAM-диск такой медленный для одной БОЛЬШОЙ последовательной записи?
Конечно, такая низкая скорость записи происходит на RAM-дисках в Windows, поскольку я тестировал ту же «концепцию» в Linux с собственным RAM-диском Linux, а RAM-диск Linux может записывать со скоростью около одного гигабайта в секунду.
Обратите внимание, что я также тестировал SoftPerfect и другие RAM-диски в Windows, скорость RAM-диска почти одинакова, скорость записи не превышает ста мегабайт в секунду.
Фактическая протестированная Windows: 10 и 11 (как в HOME, так и в PRO, на 64-разрядной версии), формат RAM-диска (exFAT и NTFS); поскольку скорость RAM-диска была слишком низкой, я пытался найти одну версию Windows, в которой скорость RAM-диска была бы нормальной, но не нашел ни одной. Фактическое протестированное ядро Linux: только 5.15.11, поскольку собственная скорость RAM-диска Linux была нормальной, я не тестировал никакое другое ядро.
Надеюсь, что это поможет другим людям, так как знания являются основой для решения проблемы.