Адрес памяти доступа в c#

Я использовал sqlite для вставки миллионов строк во время выполнения, и это то, что я использовал для повышения производительности:

  • Используйте как можно меньше транзакций.
  • Используйте параметризованные команды для вставки данных (подготовьте команду один раз и просто измените значения параметра в цикле)
  • Установите PRAGMA синхронно OFF (не уверен, как это работает с WAL)
  • Увеличение размера страницы базы данных.
  • Увеличение размера кэша. Это важный параметр, поскольку он заставляет sqlite фактически записывать данные на диск меньше раз и будет выполнять больше операций в памяти, ускоряя весь процесс.
  • Если вам нужен индекс, добавьте его после вставки строк, выполнив необходимую команду sqlite. В этом случае вам нужно будет убедиться в уникальности, как вы это делаете сейчас.

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

5
задан chocojosh 9 June 2009 в 20:15
поделиться

4 ответа

Я настоятельно рекомендую вам использовать IntPtr и Marshal.Copy. Вот код для начала. memAddr - это адрес памяти, который вам предоставлен, а bufSize - это размер.

IntPtr bufPtr = new IntPtr(memAddr);
byte[] data = new byte[bufSize];
Marshal.Copy(bufPtr, data, 0, bufSize);

Это не требует от вас использования небезопасного кода, который требует параметра компилятора / unsafe и не может быть проверен CLR.

Если вам нужно массив из чего-то другого, кроме байтов, просто измените вторую строку. Marshal.Copy содержит множество перегрузок.

7
ответ дан 18 December 2019 в 07:10
поделиться

Вы можете использовать Marshal.Copy для копирования данных из собственного память в управляемый массив. Таким образом, вы можете затем использовать данные в управляемом коде без использования небезопасного кода.

11
ответ дан 18 December 2019 в 07:10
поделиться

Я думаю, вы ищете тип IntPtr . Этот тип (при использовании в блоке unsafe ) позволит вам использовать дескриптор памяти из компонента ActiveX.

3
ответ дан 18 December 2019 в 07:10
поделиться

C # может использовать указатели. Просто используйте ключевое слово unsafe перед своим классом, блоком, методом или переменной-членом (не локальными переменными). Если класс помечен как небезопасный, все переменные-члены также небезопасны.

unsafe class Foo
{

}

unsafe int FooMethod
{

}

Тогда вы можете использовать указатели с * и & точно так же, как C.

Я не знаю о компонентах ActiveX в том же адресном пространстве.

1
ответ дан 18 December 2019 в 07:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: