Дисковый словарь / кеш для c # - PullRequest
11 голосов
/ 03 января 2009

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

связанные вопросы, но для разных языков:

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

Мне не нужно (или я хочу платить за что-либо) постоянство, транзакции, безопасность потоков или тому подобное, и хочу что-то, что не намного сложнее, чем List <> или Dictionary <>.

Если мне нужно написать код, я просто сохраню все как файлы во временном каталоге:

string Get(int i)
{
   File.ReadAllText(Path.Combine(root,i.ToString());
}

В моих случаях индекс будет int (и они должны быть последовательными или достаточно близкими), а данные будут string, так что я могу избежать обработки как POD и предпочел бы перейти на сверхлегкий и сделать именно это.

Дело в том, что у меня есть последовательность из 3k файлов (как в файлах с 1 по 3000) общим объемом 650 МБ, и мне нужно сделать diff для каждого шага в последовательности. Я ожидаю, что это будет примерно столько же или чуть больше, и я не хочу хранить все это в памяти (могут появиться большие случаи, когда я просто не могу).


Несколько человек предложили разные решения для моей проблемы. Однако ни одна из них, похоже, не нацелена на мою маленькую нишу. Причины, по которым я обращаю внимание на кэширование на диске, состоят в том, что я ожидаю, что мое текущее использование будет занимать от 1/3 до 1/2 моего доступного адресного пространства. Я беспокоюсь, что в больших случаях просто не хватит места. Я не волнуюсь по поводу шагов, настойчивости или репликации. То, что я ищу, - это минимальное решение, использующее минимум кода, минимальный объем использования, минимальные накладные расходы памяти и минимальную сложность.

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

Ответы [ 10 ]

4 голосов
/ 03 января 2009

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

Я не знаю ни одного широко используемого, высококачественного отдельного B-Tree для C #.

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

2 голосов
/ 05 января 2009

Это очень похоже на мой вопрос

Ищем простую автономную постоянную реализацию словаря в C #

Я не думаю, что библиотека, которая точно соответствует тому, что вы хотите, существует, возможно, пришло время для нового проекта на github.

2 голосов
/ 03 января 2009

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

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

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

1 голос
/ 03 марта 2009

Вот реализация B-Tree для .net: http://bplusdotnet.sourceforge.net/

0 голосов
/ 04 января 2009

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

0 голосов
/ 03 января 2009

Я рекомендую блок Caching Application в Enterprise Library от MS. Это также было рекомендовано, но ссылка указывает на статью о доступе к данным в Корпоративной библиотеке.

Вот ссылка на блок приложения кэширования:

http://msdn.microsoft.com/en-us/library/cc309502.aspx

И, в частности, вы захотите создать новое резервное хранилище (если его нет на диске):

http://msdn.microsoft.com/en-us/library/cc309121.aspx

0 голосов
/ 03 января 2009

Я бы взял маршрут встроенной БД (SQLite, Firebird), но вот некоторые другие варианты:

0 голосов
/ 03 января 2009

Я частично перенес Java-приложение EhCache в .NET Распределенное кэширование еще не реализовано, но на одном узле все оригинальные тесты UnitTests проходят. Полный OpenSource:

http://sourceforge.net/projects/thecache/

Я могу создать двоичный файл, если вам это нужно (теперь доступен только исходный код)

0 голосов
/ 03 января 2009

Попробуйте посмотреть NCache здесь также.

Я не связан с этой компанией. Я только что скачал и протестировал их бесплатную экспресс-версию.

0 голосов
/ 03 января 2009

вы можете использовать блок приложения MS с дисковым кешем

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...