Подтвердить что ты не робот

Диск с поддержкой словаря/кеша для С#

Я ищу решение для кэширования больших объемов данных.

но для разных языков:

Закройте вопрос в разных терминах:

Мне не нужно (или не хочу ничего платить за) настойчивость, транзакции, безопасность потоков и т.п., и нужно что-то более сложное для использования, чем 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 моего доступного адресного пространства. Я обеспокоен тем, что в больших корпусах будет просто закончиться пространство. Я не беспокоюсь о потере, настойчивости или репликации. Я ищу минимальное решение, используя минимальный код, минимальную печать для использования, минимальную память и минимальную сложность.

Я начинаю думать, что я слишком оптимистичен.

4b9b3361

Ответ 1

То, что вы действительно хотите, это B-Tree. Это основная структура данных, которую использует база данных. Он предназначен для эффективного обмена разделами структуры данных с диском по мере необходимости.

Я не знаю каких-либо широко используемых высококачественных автономных реализаций B-Tree для С#.

Однако простой способ получить это можно было бы с помощью базы данных Sql Compact. Механизм Sql Compact будет работать в процессе, поэтому вам не потребуется отдельная работа. Это даст вам b-дерево, но без всех головных болей. Вы можете просто использовать SQL для доступа к данным.

Ответ 2

Отказ от ответственности - я собираюсь указать вам на продукт, в котором я участвую.

Я все еще работаю на стороне сайта, поэтому информации не так много, но Serial Killer будет хорошо подходит для этого. У меня есть примеры, которые используют сериализацию .Net(может поставлять примеры), поэтому запись постоянного кэша карты для. Сериализуемых объектов .Net будет тривиальной.

Достаточно бесстыдной саморекламы - если интересно, используйте контактную ссылку на веб-сайте.

Ответ 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

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