Как встроить таблицу только для чтения в DLL - PullRequest
1 голос
/ 11 мая 2011

Мой файл DLL требует некоторых карт преобразования кодовых страниц. Некоторые строки должны быть преобразованы char в char. В настоящее время я создал несколько огромных словарей, которые содержат эти карты. Эти словари настолько велики, что мне пришлось разделить их на 8 словарей, иначе C # не позволил мне скомпилировать. Теперь загрузка приложения занимает несколько секунд, и он использует слишком много памяти.

Я бы хотел, чтобы это было немного более эффективно. Может быть, я могу встроить (или несколько) таблицы в моей DLL и запросить его с помощью sql или linq или что-то. Теперь я знаю, что DLL не для хранения данных, но мои клиенты оценят один DLL-файл. Таблица должна быть только для чтения и содержать ~ 62000 строк.

Дополнительная информация:

У меня есть 10 кодовых страниц, которые мне нужно преобразовать в юникод И обратно.

6 из этих кодовых страниц являются однобайтовыми и не имеют большого значения. (6 * 256 * 2 = 3072 позиции)

4 из них являются двухбайтовыми кодовыми страницами, CP932, CP950, CP936 и CP949, составляют ~ 62000 * 2 = 124000 элементов

Я мог бы пропустить первые 128 символов любой кодировки, но это не имеет особого смысла.

Если бы я мог сохранить это в запрашиваемой форме, мне нужно было бы сохранить ~ 62000 + 1536 записей и использовать их для преобразования в обоих направлениях.

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

Поиск должен быть быстрым, в худшем случае мне нужно конвертировать около 20 предложений в секунду. Задержка не желательна, она должна идти в ногу.

Возможно ли это и как лучше всего достичь этого?

Ответы [ 3 ]

2 голосов
/ 11 мая 2011

Встраивание таблицы в файл ресурсов не помогает с потреблением памяти , поскольку при обращении к сборке ее необходимо загрузить в память - хотя не всегда весь файл загружается, но как только вы доступ к ресурсу, все загружается.

Лучшее решение, которое мне приходит в голову, - это Sqlite или Sql Server Compact file , который отправляется клиенту вместе с DLL и содержит данные. Запрос локального файла базы данных уменьшит потребление памяти.

1 голос
/ 11 мая 2011

Вы можете использовать файл ресурсов для хранения ваших данных, когда вы скомпилируете приложение, которое будет встроено в одну dll msdn

0 голосов
/ 11 мая 2011

Надеюсь, я не неправильно понимаю ваши потребности, но, возможно, вам стоит подумать об использовании большого массива вместо словаря.Предполагая, что 16-разрядные кодовые точки Unicode - это все, что вам нужно для обработки (суррогатные пары бросают гаечный ключ во всем), просто создайте таблицу 65 536 символов.

Такая таблица может занять 128 КБ, если вы отображаетеот символа к символу или более, если вам нужно сопоставить с другой информацией.Однако вы не будете платить за служебные расходы для внутренних структур данных словаря, и вы можете декларативно объявить массив:

private char [] mymap = new char [65536] {... // 65536 вещи}

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

Опять же, если это не соответствует вашим потребностям, пожалуйста, предоставьте больше контекста о том, как вы в настоящее времяконвертирование, и я с удовольствием либо отредактирую, либо удалю.

...