Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
 Разбиение большого файла на маленькие со сжатием Gzip  [new]
lex452
Member

Откуда:
Сообщений: 595
Стоит задача разбивать большие файлы (возможно по несколько ГБ), на несколько маленьких по заданному количеству строк. С возможностью сжатия конечного файла GZIP. Вроде задача не супер сложная, но меня не устраивает потребление памяти.
Считывал файл построчно StreamReader, сначала в stringbuilder, но программа съедала памяти в 2-3 раза больше чем сами данные.
Потом перешел на массив строк с последующим преобразованием в массив байт и сжатием через gzipstream . Но тоже потребление памяти раза в 2 выше чем сами данные. Хочу сжатие производить в оперативке, чтобы не нагружать файловую систему. Подскажите возможно ли как-то реализовать чтение файла и запись его в поток gzip c минимальными затратами оперативки?
3 окт 21, 21:40    [22378950]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение большого файла на маленькие со сжатием Gzip  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4283
как то так, не?

const int LinesCount = 100;
int fileNumber = 0;
using (var source = File.OpenRead("path"))
using (var textReader = new StreamReader(source))
{

    while (!textReader.EndOfStream)
    {
        using (var target = File.Create($"filename_{++fileNumber}"))
        using (var gzipStream = new GZipStream(target, CompressionLevel.Optimal))
        using (var writer = new StreamWriter(gzipStream))
        {
            for (var i = 0; i < LinesCount && !textReader.EndOfStream; i++)
            {
                var line = await textReader.ReadLineAsync();
                await writer.WriteLineAsync(line);
            }
        }
    }
}
3 окт 21, 23:21    [22378966]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение большого файла на маленькие со сжатием Gzip  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4450
lex452
Стоит задача разбивать большие файлы (возможно по несколько ГБ), на несколько маленьких по заданному количеству строк. С возможностью сжатия конечного файла GZIP. Вроде задача не супер сложная, но меня не устраивает потребление памяти.
Считывал файл построчно StreamReader, сначала в stringbuilder, но программа съедала памяти в 2-3 раза больше чем сами данные.
Потом перешел на массив строк с последующим преобразованием в массив байт и сжатием через gzipstream . Но тоже потребление памяти раза в 2 выше чем сами данные. Хочу сжатие производить в оперативке, чтобы не нагружать файловую систему. Подскажите возможно ли как-то реализовать чтение файла и запись его в поток gzip c минимальными затратами оперативки?


так вы чего хотите на худой конец?

к слову: зипование - оно же тоже не построчно делается, эта фигня оценивает (читает) весь файл перед тем как начать зиповать и т.д.
4 окт 21, 10:59    [22379049]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение большого файла на маленькие со сжатием Gzip  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 4283
Ролг Хупин,

любой архиватор более менее нормальный умеет сжимать потоки, никакие полные файлы ему для этого не нужно.
а gzip'у это сам бог велел уметь.
4 окт 21, 11:00    [22379051]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение большого файла на маленькие со сжатием Gzip  [new]
lex452
Member

Откуда:
Сообщений: 595
Roman Mejtes
как то так, не?

const int LinesCount = 100;
int fileNumber = 0;
using (var source = File.OpenRead("path"))
using (var textReader = new StreamReader(source))
{

    while (!textReader.EndOfStream)
    {
        using (var target = File.Create($"filename_{++fileNumber}"))
        using (var gzipStream = new GZipStream(target, CompressionLevel.Optimal))
        using (var writer = new StreamWriter(gzipStream))
        {
            for (var i = 0; i < LinesCount && !textReader.EndOfStream; i++)
            {
                var line = await textReader.ReadLineAsync();
                await writer.WriteLineAsync(line);
            }
        }
    }
}

Спасибо, это примерно то что нужно. Видимо я слишком ограниченно читал документацию. Там пример для gzipstream через copyto. Вот и не дошло сразу как это применять
4 окт 21, 11:05    [22379055]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение большого файла на маленькие со сжатием Gzip  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4450
Roman Mejtes
Ролг Хупин,

любой архиватор более менее нормальный умеет сжимать потоки, никакие полные файлы ему для этого не нужно.
а gzip'у это сам бог велел уметь.


не спорю, я предположил, хорошо, если так, если зип умеет оценить файл без чтения всего, оценить таблицу кодировки и т.д.
4 окт 21, 11:10    [22379058]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение большого файла на маленькие со сжатием Gzip  [new]
lex452
Member

Откуда:
Сообщений: 595
Ролг Хупин
Roman Mejtes
Ролг Хупин,

любой архиватор более менее нормальный умеет сжимать потоки, никакие полные файлы ему для этого не нужно.
а gzip'у это сам бог велел уметь.


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

Ну кодировку можно в ридере и врайтере задать
4 окт 21, 12:21    [22379087]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение большого файла на маленькие со сжатием Gzip  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4450
lex452
Ролг Хупин
пропущено...


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

Ну кодировку можно в ридере и врайтере задать


имелась в виду не та кодировка, ну да, ладно
4 окт 21, 13:33    [22379124]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение большого файла на маленькие со сжатием Gzip  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22584
Ролг Хупин
не спорю, я предположил, хорошо, если так, если зип умеет оценить файл без чтения всего, оценить таблицу кодировки и т.д.
естественно, словарь ему нужно составить, то есть прочитать более-менее заметную часть, другой вопрос, что он может читать блоками, а не анализировать весь файл, это слишком долго. ЕМНИП в диалоге 7zip можно даже задать размер этого блока
4 окт 21, 14:40    [22379160]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение большого файла на маленькие со сжатием Gzip  [new]
lex452
Member

Откуда:
Сообщений: 595
Shocker.Pro,

Зачем оценивать файл? Мне нужно его просто сжать
4 окт 21, 16:03    [22379206]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение большого файла на маленькие со сжатием Gzip  [new]
lex452
Member

Откуда:
Сообщений: 595
И сразу возник вопрос, как добавить данные к файлу, который уже под GZIP не распаковывая его?
4 окт 21, 18:23    [22379298]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение большого файла на маленькие со сжатием Gzip  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 22584
lex452
Зачем оценивать файл? Мне нужно его просто сжать
Чтобы сжать, нужно найти повторяющиеся паттерны и составить их словарь. Это значит, что придется все равно просматривать на сколько-то вперед, нельзя просто сжать поток байт-за-байтом, какой-то оцениваемый блок так или иначе будет
4 окт 21, 19:12    [22379309]     Ответить | Цитировать Сообщить модератору
 Re: Разбиение большого файла на маленькие со сжатием Gzip  [new]
Где-то в степи
Member

Откуда: Под Таганрогом
Сообщений: 4388
Вангую, имхо: обыкновенное ТЗ, парня решили прощупать на больших данных, зип куска - лирика, кусок можно на стенку повесить,
почтой отправить ... или ещёчо
Бро, достойно решил, в стиле российских гос. структур ( насмотрелся этого ужаса), вытащить все в билдер и прифуярит все что можно ))
7 окт 21, 00:09    [22380339]     Ответить | Цитировать Сообщить модератору
Все форумы / WinForms, .Net Framework Ответить