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 была нормальной, я не тестировал никакое другое ядро.

Надеюсь, что это поможет другим людям, так как знания являются основой для решения проблемы.

Другие вопросы по тегам