Как построить систему предварительной выборки прикладного уровня - PullRequest
2 голосов
/ 07 марта 2012

Я работаю в смешанном проекте C / C ++, который имеет следующую ситуацию.

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

Проблема в том, как мне сбалансировать размер кеша? Есть ли какой-нибудь известный алгоритм / библиотека, которым я могу воспользоваться?


ОБНОВЛЕНИЕ: (меняет название)

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

Я думаю, что здесь упустил что-то важное. На самом деле я строю приложение на существующей платформе, в которой частые запросы на чтение к движку часто обходятся мне слишком дорого. (Да, я полагаю, что механизм использует преимущества кэшей ОС и уровня диска.) И я действительно пытаюсь создать систему предварительной выборки на уровне приложения.

Мысли

Ответы [ 2 ]

0 голосов
/ 08 марта 2012

Вы пробовали mmap() извлекать файл вместо read() извлекать из него? В некоторых случаях это может быть более эффективным, а в некоторых - нет. Однако обычно лучше позволить системе оптимизироваться для вас, поскольку она знает больше об оборудовании, чем о приложении. mmap() сообщит системе, что вам нужен весь файл, поэтому он может быть более оптимальным.

0 голосов
/ 07 марта 2012

В общем, вы должны стараться использовать то, что дает вам ОС, а не создавать свой собственный кеш (потому что вы рискуете кешировать дважды). для linux вы можете запросить кэширование на уровне ОС через readahead () ; я не знаю, каков будет эквивалент Windows.

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

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

...