Диск с поддержкой словаря/кеша для С#
Я ищу решение для кэширования больших объемов данных.
но для разных языков:
Закройте вопрос в разных терминах:
Мне не нужно (или не хочу ничего платить за) настойчивость, транзакции, безопасность потоков и т.п., и нужно что-то более сложное для использования, чем List < > или Dictionary < > .
Если мне нужно написать код, я просто сэкономлю все файлы в каталоге temp:
string Get(int i)
{
File.ReadAllText(Path.Combine(root,i.ToString());
}
В моих случаях в индексе будет int
(и они должны быть последовательно или достаточно близко), и данные будут string
, поэтому я могу уйти с рассмотрением как POD и скорее уйдет в ультра-свете и сделает именно это.
Использование состоит в том, что у меня есть последовательность из 3k файлов (как в файле № 1 до # 3000) общим объемом 650 МБ, и вам нужно сделать diff для каждого шага в последовательности. Я ожидаю, что общая сумма будет примерно одинаковой или немного больше, и я не хочу хранить все это в памяти (большие случаи могут возникать там, где я просто не могу).
Ряд людей предложили различные решения для моей проблемы. Однако ничто, кажется, не нацелено на мою маленькую нишу. Причины, по которым я ищу кэширование на основе диска, связаны с тем, что я ожидаю, что мое текущее использование будет использовать от 1/3 до 1/2 моего доступного адресного пространства. Я обеспокоен тем, что в больших корпусах будет просто закончиться пространство. Я не беспокоюсь о потере, настойчивости или репликации. Я ищу минимальное решение, используя минимальный код, минимальную печать для использования, минимальную память и минимальную сложность.
Я начинаю думать, что я слишком оптимистичен.
Ответы
Ответ 1
То, что вы действительно хотите, это B-Tree.
Это основная структура данных, которую использует база данных.
Он предназначен для эффективного обмена разделами структуры данных с диском по мере необходимости.
Я не знаю каких-либо широко используемых высококачественных автономных реализаций B-Tree для С#.
Однако простой способ получить это можно было бы с помощью базы данных Sql Compact. Механизм Sql Compact будет работать в процессе, поэтому вам не потребуется отдельная работа. Это даст вам b-дерево, но без всех головных болей. Вы можете просто использовать SQL для доступа к данным.
Ответ 2
Отказ от ответственности - я собираюсь указать вам на продукт, в котором я участвую.
Я все еще работаю на стороне сайта, поэтому информации не так много, но Serial Killer будет хорошо подходит для этого. У меня есть примеры, которые используют сериализацию .Net(может поставлять примеры), поэтому запись постоянного кэша карты для. Сериализуемых объектов .Net будет тривиальной.
Достаточно бесстыдной саморекламы - если интересно, используйте контактную ссылку на веб-сайте.
Ответ 3
Это очень похоже на мой вопрос
Ищете простую автономную постоянную реализацию словаря на С#
Я не думаю, что библиотека, которая точно соответствует тому, что вы хотите, существует, возможно, это время для нового проекта на github.
Ответ 4
Вот реализация B-Tree для .net: http://bplusdotnet.sourceforge.net/
Ответ 5
вы можете использовать блок приложений MS с дисковым решением для кеша
Ответ 6
Попробуйте найти NCache здесь.
Я не являюсь аффилированным лицом этой компании. Я только что загрузил и протестировал их бесплатную экспресс-версию.
Ответ 7
Я частично применил приложение Java EhCache к .NET. Распределенное кэширование еще не реализовано, но на одном node все оригинальные пропуски UnitTests. Полный OpenSource:
http://sourceforge.net/projects/thecache/
Я могу создать двоичный кадр, если он вам нужен (только исходный код теперь доступен)
Ответ 8
Я бы взял встроенный маршрут DB (SQLite, Firebird), но вот несколько других вариантов:
Ответ 9
Я рекомендую блок приложения кэширования в корпоративной библиотеке от MS. Это также было рекомендовано, но ссылка указывает на статью о части доступа к данным в корпоративной библиотеке.
Вот ссылка на блок приложения кэширования:
http://msdn.microsoft.com/en-us/library/cc309502.aspx
И, в частности, вы захотите создать новое хранилище резервных копий (если тот, который сохраняется на диске, не существует):
http://msdn.microsoft.com/en-us/library/cc309121.aspx
Ответ 10
Учитывая ваши недавние изменения в вопросе, я предлагаю вам реализовать решение, указанное в вашем вопросе, так как вы вряд ли найдете такое наивное решение, завершенное в библиотеке для повторного использования.