Быстрый доступ к распределенной памяти в C#
У меня есть служба CF WCF, которая размещает 120 ГБ памяти в Dictionary<File,byte[]>
для очень быстрого доступа к содержимому файла, который действительно хорошо работал со мной. После доступа содержимое файла было помещено в MemoryStream и прочитано
Этот сервис необходимо перезапускать каждый день, чтобы загрузить некоторые статические данные из базы данных, которые могут меняться ежедневно. Перезапуск занял так много времени из-за огромных данных, которые необходимо снова загрузить в память
Поэтому я решил разместить эту память в другом процессе на той же машине и получить к ней доступ через сокеты. Процесс данных всегда будет запущен. TcpListener/Client и NetworkStream использовались аналогично следующему
memoryStream.Read(position.PositionData, 0, position.SizeOfData);
position.NetworkStream.Write(position.PositionData, 0, position.SizeOfData);
Проблема в том, что это было в 10 раз медленнее, чем размещение памяти в одном и том же процессе. Ожидается замедление, но в 10 раз это слишком много.
Я думал о MemoryMappedFiles, но они более полезны для произвольного доступа к конкретному представлению файла. Мой доступ к файлам является последовательным от начала до конца.
Есть ли другая технология или библиотека, которая может быть использована в моем случае? или это просто так ожидается?
1 ответ
Я предполагаю, что вы используете SQLServer. Если это так, уведомления Service Broker и SQLNotificaiton Or Query могут быть вашими друзьями здесь. Я полагаю, вам нужно больше модели push-сообщений, которая автоматически распространяет изменения обратно в сервис (если что-то меняется в БД). Поэтому избегайте перезапуска процесса, интенсивно использующего память / ресурсы, поэтому нет необходимости переназначать свой тяжелый словарь.