Преобразует ли преобразование потока protobuf-net в base64 преимущества протобуфа? - PullRequest
1 голос
/ 05 декабря 2011

Я только начал использовать библиотеку protobuf для постоянного глобального кеширования некоторых дорогих запросов.Я храню его в текстовом поле в MSSQL и в мемо-поле в MSAccess и буду расширять его до Sqlite, поэтому я неохотно использую двоичное поле, если мне не нужно - я полагаю, что строковые манипуляции будут работать лучше cross dbчем двоичныйПохоже, что шаг ToBase64String отменяет различные преимущества protobuf (размер, скорость, использование памяти).

public void StoreInDb(T dataPoints, string parameters, string queryName)
{
    //Store in cache
    MemoryStream stream = new MemoryStream();
    Serializer.Serialize(stream, dataPoints);
    byte[] data = new byte[stream.Length];
    stream.Seek(0, SeekOrigin.Begin);
    stream.Read(data, 0, data.Length);
    string output = Convert.ToBase64String(data); //Meh, not pretty
    using (CacheInsert inserter = new CacheInsert())
    {
        inserter.Insert(parameters, output, DateTime.Now.AddDays(1), queryName);
    }

}

Есть предложения, как сделать это быстрее и дешевле?

Ответы [ 2 ]

3 голосов
/ 05 декабря 2011

Вы можете избежать дублирования данных, используя:

string base64 = Convert.ToBase64String(
       stream.GetBuffer(), 0, (int)stream.Length);

Base-64 добавляет немного накладных расходов, но обычно должно быть в порядке. Если ваш строковый тип данных UTF-16, обратите внимание, что он, разумеется, снова удвоит размер.

1 голос
/ 05 декабря 2011

Я бы попытался сохранить данные в двоичном формате и вернуться к хранению в виде строки, где двоичные типы данных не разрешены (если они вообще есть). Однако, если вам нужно преобразовать в строку base-64, вы не отмените все преимущества protobuf; результат все равно будет более сжатым, чем если бы вы конвертировали исходные необработанные данные в base64.

...