Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Разбиение большого файла на маленькие со сжатием Gzip / 13 сообщений из 13, страница 1 из 1
03.10.2021, 21:40
    #40101652
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение большого файла на маленькие со сжатием Gzip
Стоит задача разбивать большие файлы (возможно по несколько ГБ), на несколько маленьких по заданному количеству строк. С возможностью сжатия конечного файла GZIP. Вроде задача не супер сложная, но меня не устраивает потребление памяти.
Считывал файл построчно StreamReader, сначала в stringbuilder, но программа съедала памяти в 2-3 раза больше чем сами данные.
Потом перешел на массив строк с последующим преобразованием в массив байт и сжатием через gzipstream . Но тоже потребление памяти раза в 2 выше чем сами данные. Хочу сжатие производить в оперативке, чтобы не нагружать файловую систему. Подскажите возможно ли как-то реализовать чтение файла и запись его в поток gzip c минимальными затратами оперативки?
...
Рейтинг: 0 / 0
03.10.2021, 23:21
    #40101660
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение большого файла на маленькие со сжатием Gzip
как то так, не?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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);
            }
        }
    }
}
...
Рейтинг: 0 / 0
04.10.2021, 10:59
    #40101722
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение большого файла на маленькие со сжатием Gzip
lex452
Стоит задача разбивать большие файлы (возможно по несколько ГБ), на несколько маленьких по заданному количеству строк. С возможностью сжатия конечного файла GZIP. Вроде задача не супер сложная, но меня не устраивает потребление памяти.
Считывал файл построчно StreamReader, сначала в stringbuilder, но программа съедала памяти в 2-3 раза больше чем сами данные.
Потом перешел на массив строк с последующим преобразованием в массив байт и сжатием через gzipstream . Но тоже потребление памяти раза в 2 выше чем сами данные . Хочу сжатие производить в оперативке, чтобы не нагружать файловую систему . Подскажите возможно ли как-то реализовать чтение файла и запись его в поток gzip c минимальными затратами оперативки?


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

к слову: зипование - оно же тоже не построчно делается, эта фигня оценивает (читает) весь файл перед тем как начать зиповать и т.д.
...
Рейтинг: 0 / 0
04.10.2021, 11:00
    #40101724
Roman Mejtes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение большого файла на маленькие со сжатием Gzip
Ролг Хупин,

любой архиватор более менее нормальный умеет сжимать потоки, никакие полные файлы ему для этого не нужно.
а gzip'у это сам бог велел уметь.
...
Рейтинг: 0 / 0
04.10.2021, 11:05
    #40101727
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение большого файла на маленькие со сжатием Gzip
Roman Mejtes
как то так, не?

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
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. Вот и не дошло сразу как это применять
...
Рейтинг: 0 / 0
04.10.2021, 11:10
    #40101730
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение большого файла на маленькие со сжатием Gzip
Roman Mejtes
Ролг Хупин,

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


не спорю, я предположил, хорошо, если так, если зип умеет оценить файл без чтения всего, оценить таблицу кодировки и т.д.
...
Рейтинг: 0 / 0
04.10.2021, 12:21
    #40101755
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение большого файла на маленькие со сжатием Gzip
Ролг Хупин
Roman Mejtes
Ролг Хупин,

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


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

Ну кодировку можно в ридере и врайтере задать
...
Рейтинг: 0 / 0
04.10.2021, 13:33
    #40101786
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение большого файла на маленькие со сжатием Gzip
lex452
Ролг Хупин
пропущено...


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

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


имелась в виду не та кодировка, ну да, ладно
...
Рейтинг: 0 / 0
04.10.2021, 14:40
    #40101812
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение большого файла на маленькие со сжатием Gzip
Ролг Хупин
не спорю, я предположил, хорошо, если так, если зип умеет оценить файл без чтения всего, оценить таблицу кодировки и т.д.
естественно, словарь ему нужно составить, то есть прочитать более-менее заметную часть, другой вопрос, что он может читать блоками, а не анализировать весь файл, это слишком долго. ЕМНИП в диалоге 7zip можно даже задать размер этого блока
...
Рейтинг: 0 / 0
04.10.2021, 16:03
    #40101841
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение большого файла на маленькие со сжатием Gzip
Shocker.Pro,

Зачем оценивать файл? Мне нужно его просто сжать
...
Рейтинг: 0 / 0
04.10.2021, 18:23
    #40101902
lex452
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение большого файла на маленькие со сжатием Gzip
И сразу возник вопрос, как добавить данные к файлу, который уже под GZIP не распаковывая его?
...
Рейтинг: 0 / 0
04.10.2021, 19:12
    #40101908
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение большого файла на маленькие со сжатием Gzip
lex452
Зачем оценивать файл? Мне нужно его просто сжать
Чтобы сжать, нужно найти повторяющиеся паттерны и составить их словарь. Это значит, что придется все равно просматривать на сколько-то вперед, нельзя просто сжать поток байт-за-байтом, какой-то оцениваемый блок так или иначе будет
...
Рейтинг: 0 / 0
07.10.2021, 00:09
    #40102495
Где-то в степи
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Разбиение большого файла на маленькие со сжатием Gzip
Вангую, имхо: обыкновенное ТЗ, парня решили прощупать на больших данных, зип куска - лирика, кусок можно на стенку повесить,
почтой отправить ... или ещёчо
Бро, достойно решил, в стиле российских гос. структур ( насмотрелся этого ужаса), вытащить все в билдер и прифуярит все что можно ))
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Разбиение большого файла на маленькие со сжатием Gzip / 13 сообщений из 13, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]