Szukam jakiegoś prostego sposobu na kompresje bezstratną tablicy double[,] i zapisanie do pliku.
zip?
na dzień dzisiejszy używam czegoś takiego:
List<byte> list = new List<byte>();
for (int i = 0; i < rozmiar; i++)
{
list.AddRange(BitConverter.GetBytes(l1d[i]));
}
for (int i = 0; i < rozmiar; i++)
{
list.AddRange(BitConverter.GetBytes(a1d[i]));
}
for (int i = 0; i < rozmiar; i++)
{
list.AddRange(BitConverter.GetBytes(b1d[i]));
}
MemoryStream memoryStream = new MemoryStream();
GZipStream zipStream = new GZipStream(memoryStream, CompressionMode.Compress);
zipStream.Write(list.ToArray(), 0, list.Count);
FileStream fileStream = new FileStream("plik.rrr", FileMode.Create);
fileStream.Write(memoryStream.GetBuffer(), 0, (int)memoryStream.Position);
fileStream.Close();
ale poszukuje jakiegos lepszego sposobu.
A ten sposob jest dla Ciebie nieodpowiedni, bo...?
johny_bravo napisał(a)
A ten sposob jest dla Ciebie nieodpowiedni, bo...?
bo jest bardzo powolny i mysle ze to przez to kombinowanie z ta iloscia streamow i chyba zbedna lista.
No też mi się wydało to dziwną konstrukcją, ale nie wiem, jaki kod jest wcześniej.
No ale skoro sam się domyślasz, co jest źle, to czemu tego nie zmienisz?
Czym jest l1d, a1d i b1d? Zamiast listy mozesz uzyc drugiego MemoryStream.
somekind napisał(a)
No ale skoro sam się domyślasz, co jest źle, to czemu tego nie zmienisz?
ponieważ nie wiem co mogę poprawić i raczej pytałem bo liczyłem na jakieś całkiem inne rozwiązanie.
johny_bravo napisał(a)
Czym jest l1d, a1d i b1d?
to sa double[]
Hmm...
Nie wiem, czy jest sens kompresji do strumienia w pamięci, a potem zapisywania go na dysk. Ale na wszelki wypadek zakomentowana część kodu tak właśnie robi.
using System;
using System.Collections.Generic;
using System.IO;
using System.IO.Compression;
namespace DoubleCompresionTest
{
class Program
{
static void Main(string[] args)
{
string path = @"D:\double.bin";
double[] pamparampam = new double[] { 7, 29, 666 };
byte[] bytes = new byte[pamparampam.Length * sizeof(double)];
Buffer.BlockCopy(pamparampam, 0, bytes, 0, bytes.Length);
//using (MemoryStream ms = new MemoryStream())
//{
// using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress))
// {
// zip.Write(bytes, 0, bytes.Length);
// }
// File.WriteAllBytes(path, ms.ToArray());
//}
using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
using (GZipStream zip = new GZipStream(fs, CompressionMode.Compress))
{
zip.Write(bytes, 0, bytes.Length);
}
}
}
}
}