Исключение GZipStream нехватки памяти при распаковке

У меня есть массивный большой набор данных, который содержит почти 700 столбцов, и я использую GZipStream для сжатия и распаковки. Сжатие работает нормально, и размер набора данных после сжатия составляет почти 40 МБ, но во время распаковки я получаю исключение «системе не хватает памяти». Я использую приведенный ниже код для сжатия и распаковки:

Сжатие:

public static Byte[] CompressDataSet(DataSet dataset)
{
    Byte[] data;
    MemoryStream mem = new MemoryStream();
    GZipStream zip = new GZipStream(mem, CompressionMode.Compress);
    dataset.WriteXml(zip, XmlWriteMode.WriteSchema);
    zip.Close();
    data = mem.ToArray();
    mem.Close();
    return data;

}

Распаковка:

public static DataSet DecompressDataSet(Byte[] data)
{
    MemoryStream mem = new MemoryStream(data);
    GZipStream zip = new GZipStream(mem, CompressionMode.Decompress);
    DataSet dataset = new DataSet();
    dataset.ReadXml(zip, XmlReadMode.ReadSchema);
    zip.Close();
    mem.Close();
    return dataset;

}

Пожалуйста, порекомендуйте любую другую библиотеку сжатия, если GZipStream не оптимален/подходит для массивных больших наборов данных. заранее спасибо


person saadsaf    schedule 13.04.2017    source источник


Ответы (1)


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

public static Byte[] CompressDataSet(DataSet dataSet)
{
    using (MemoryStream inputStream = new MemoryStream())
    using (MemoryStream resultStream = new MemoryStream())
    using (GZipStream gzipStream = new GZipStream(resultStream, CompressionMode.Compress))
    {
        dataSet.WriteXml(inputStream, XmlWriteMode.WriteSchema);
        inputStream.Seek(0, SeekOrigin.Begin);
        inputStream.CopyTo(gzipStream);

        gzipStream.Close();

        return resultStream.ToArray();
    }
}

public static DataSet DecompressDataSet(Byte[] data)
{
    using (MemoryStream compressedStream = new MemoryStream(data))
    using (GZipStream gzipStream = new GZipStream(compressedStream, CompressionMode.Decompress))
    using (DataSet dataset = new DataSet())
    {
        dataset.ReadXml(gzipStream, XmlReadMode.ReadSchema);
        return dataset;
    }
}
person Aydin    schedule 13.04.2017
comment
подход к сжатию, который вы указали выше, сильно использует ЦП и память и продолжает работать ... мы должны принудительно остановить его, поскольку он продолжает работать, используя огромную память и ЦП - person saadsaf; 14.04.2017
comment
Я использую тот же подход, на котором основан ваш вопрос, я тестировал данные объемом более 100 МБ, и все сработало нормально. Ваша реализация на самом деле ничего не сжимает, поэтому у вас возникают проблемы в первую очередь. - person Aydin; 14.04.2017