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

StackOverflow https://stackoverflow.com/questions/2516443

  •  22-09-2019
  •  | 
  •  

Вопрос

Или было бы быстрее еще раз перечитать эти данные из отображенной памяти, поскольку ОС может реализовать свой собственный кэш?

Природа данных заранее неизвестна, предполагается, что чтение файлов происходит случайным образом.

Это было полезно?

Решение

я хотел бы упомянуть несколько вещей, которые я прочитал на эту тему.Ответ таков НЕТ, вы же не хотите сомневаться в диспетчере памяти операционной системы.

Первый исходит из идеи, что вы хотите, чтобы ваша программа (напримерMongoDB, SQL Server), чтобы попытаться ограничить вашу память в зависимости от процента свободной оперативной памяти:

Не пытайтесь выделять память до тех пор, пока не останется только x% свободной

Иногда клиент запрашивает способ разработки своей программы таким образом, чтобы она продолжала потреблять оперативную память до тех пор, пока не останется только x% свободной.Идея заключается в том, что их программа должна агрессивно использовать оперативную память, при этом оставляя достаточно доступной оперативной памяти (x%) для другого использования.Если вы не разрабатываете систему, в которой вы являетесь единственной программой, запущенной на компьютере, это плохая идея.

(прочтите статью для получения объяснения почему это плохо, включая фотографии)

Далее следуют некоторые заметки от автора Varnish и reverse proxy:

Лаковый тайник - Заметки архитектора

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

Происходит вот что:Squid создает HTTP-объект в "оперативной памяти", и он быстро используется несколько раз после создания.Затем, через некоторое время, он больше не получает обращений, и ядро замечает это.Затем кто-то пытается получить память из ядра для чего-то, и ядро решает вытолкнуть эти неиспользуемые страницы памяти, чтобы подкачать пространство и использовать кэш-память более разумно для некоторых данных, которые фактически используются программой.Однако это делается без ведома кальмара.Squid по-прежнему думает, что эти http-объекты находятся в оперативной памяти, и они будут там в ту же секунду, как он попытается получить к ним доступ, но до тех пор оперативная память используется для чего-то продуктивного.

Представь, что ты делай кэшируйте что-либо из файла, отображенного в памяти.В какой-то момент в будущем память, содержащая этот "кэш", будет выгружена на диск.

  • операционная система записала на жесткий диск что-то, что уже существует на жестком диске

Далее наступает момент, когда вы хотите выполнить поиск из вашей "кэшированной" памяти, а не из "реальной" памяти.Вы пытаетесь получить доступ к "кешу", и поскольку он был выгружен из оперативной памяти, аппаратное обеспечение выдает PAGE FAULT, и кэш перемещается обратно в оперативную память.

  • ваша кэш-память работает так же медленно, как и "реальная" память, поскольку обе больше не находятся в оперативной памяти

Наконец, вы хотите освободить свой кэш (возможно, ваша программа завершает работу).Если "кэш" был заменен, операционная система должна сначала заменить его обратно, чтобы его можно было освободить.Если вместо этого вы просто размонтировали свой файл, отображенный в памяти, все пропало (ничего не нужно заменять).

  • в этом случае ваш кэш замедляет работу

Снова от Рэймона Чена:Если ваше приложение закрывается - закройте уже:

Когда DLL_PROCESS_DETACH сообщает вам, что процесс завершается, лучше всего просто вернуться, ничего не делая

Я регулярно пользуюсь программой, которая не следует этому правилу.Программа выделяет много памяти в течение своей жизни, и когда я выхожу из программы, она просто сидит там в течение нескольких минут, иногда крутится на 100% процессоре, иногда загружая жесткий диск (иногда и то, и другое).Когда я вхожу в отладчик, чтобы посмотреть, что происходит, я обнаруживаю, что программа не делает ничего продуктивного.Это просто методично освобождает каждый последний байт памяти, который он выделил в течение своего срока службы.

Если на моем компьютере не было большого объема памяти, то большая часть памяти, выделенной программой за время ее существования, еще не была выгружена, поэтому освобождение каждой капли памяти связано с работой процессора операция.С другой стороны, если бы я запустил сборку или выполнил что-то другое, требующее больших затрат памяти, то большая часть памяти, выделенной программой за время ее существования, была выгружена, что означает, что программа загружает всю эту память обратно с жесткого диска, просто чтобы она могла вызвать free на нем.Вообще-то, звучит несколько злобно."Давай вот так я могу сказать, чтобы ты ушел".

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


Реальность такова, что программы больше не запускаются в "ОПЕРАТИВНАЯ память", они бегут в память - виртуальный память.

Ты может используйте кэш, но вы должны работать с менеджер виртуальной памяти операционной системы:

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

Доступ к:

  • тысяча 1-байтовых местоположений вокруг файла объемом 400 ГБ

это намного дороже, чем доступ к

  • одно 1000-байтовое местоположение в файле объемом 400 ГБ

Другими словами:на самом деле тебе это не нужно Кэш данных, вам нужен более локализованный структура данных.

Если вы сохраните ваши важные данные на одной странице в формате 4k, играть с VMM будет намного приятнее;Windows является ваш тайник.

Когда вы добавляете 64-байтовые строки кэша, выровненные по четырем словам, появляется еще больше стимулов для корректировки структуры данных.Но тогда ты этого не хочешь слишком компактность, иначе вы начнете страдать от снижения производительности из-за сброса кэша из Ложный Обмен информацией.

Другие советы

Ответ сильно зависит от ОС.Вообще говоря, кэшировать эти данные смысла не будет.Как «кэшированные» данные, так и отображенные в памяти данные могут быть выгружены в любое время.

Если и будет какая-либо разница, она будет зависеть от ОС — если вам не нужна такая детализация, кэшировать данные нет смысла.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top