Предложите метод сжатия файла при отсутствии свободного места ФС

На самом деле это единственный раздел про unix на этом форуме

Модераторы: /dev/random, Модераторы разделов

smaharbA
Сообщения: 229
ОС: Windows Vista

Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение smaharbA »

Есть файл - пусть 20 Гб, на ФС 1 - 2 Гб свободного места. Предложите варианты сжатия исходного файла без привлечения внешних/сетевых носителей.
Файл должен быть сжат как единое целое, т.е. с возможностью его использования в приложениях.

Варианты есть, нужен вариант без временных файлов (не считая самого гз бз2) и вариант распаковки сжатого без наличия свободного места, зная, что свободное+архив достаточно для распаковки


(Все в пределах штатных и общедоступных команд/утилит шела)
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21261
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение Bizdelnick »

Файл насколько сильно жмётся, в нём текст? А оперативки сколько?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение smaharbA »

Bizdelnick писал(а):
27.08.2012 22:46
Файл насколько сильно жмётся, в нём текст? А оперативки сколько?


а в сабже не понятен размер файла ?

предположим заданный в сабже размер файла, т.е. 20 Гб, свободного места ФС 1 Гб, ОЗУ свободно или все 256 Мб
+ и нет внешних хранилищь
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21261
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение Bizdelnick »

smaharbA писал(а):
27.08.2012 22:57
а в сабже не понятен размер файла ?

Непонятен хотя бы приблизительный размер файла после сжатия. И непонятно, сколько файл реально занимает на диске. Хотя прочих условий достаточно, чтобы сказать, что сие почти наверняка невозможно.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение smaharbA »

ФС одна однешенька
есть файл в ФС - его размер 20 Гб
есть свободного места в ФС - 1-2 Гб
степень сжатия файла неизвестна (но более 1)
есть ОЗУ - 256-1024 Мб

нужно сжать исходный файл с заменой несжатого на сжатый

методы ? (желательно без временных файлов, с временными метод существует)

Можно и с временными - может будет интересен метод.
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение /dev/random »

Есть (опасный) вариант: dd'шкой читаем файл большими блоками, передаём компрессору, другой dd'шкой пишем обратно без обрезания. В конце смотрим, сколько записалось, и обрезаем.

Не делайте этого, если не уверены, что в файле нет плохо сжимаемых частей. Не делайте этого, если используете btrfs или что-то подобное. Не делайте этого, если есть риск, что процесс что-то прервёт.

Метод непригоден для декомпрессии.
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение smaharbA »

/dev/random писал(а):
27.08.2012 23:28
Есть (опасный) вариант: dd'шкой читаем файл большими блоками, передаём компрессору, другой dd'шкой пишем обратно без обрезания. В конце смотрим, сколько записалось, и обрезаем.

Не делайте этого, если не уверены, что в файле нет плохо сжимаемых частей. Не делайте этого, если используете btrfs или что-то подобное. Не делайте этого, если есть риск, что процесс что-то прервёт.

Метод непригоден для декомпрессии.


метод близок к существующему
опасности в потере не существует

а теперь пожалуйста напишите как Вы будете обрезать от начала ?
архив нужен такой же как если бы был сделан при достаточности свободного пространства
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение /dev/random »

smaharbA писал(а):
27.08.2012 23:32
а теперь пожалуйста напишите как Вы будете обрезать от начала ?
архив нужен такой же как если бы был сделан при достаточности свободного пространства

Простейший способ узнать требуемую длину (bash only):
(... | tee >(wc -c >&3) | ...) 3>&1
Если шелл не поддерживает конструкцию >( ), придётся, например, парсить stderr-вывод dd или делать второй (точнее, предварительный) проход сжатия.

Когда длина известна, обрезать файл можно с помощью dd или truncate.
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение smaharbA »

как обрезать от начала ?
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение /dev/random »

smaharbA писал(а):
27.08.2012 23:58
как обрезать от начала ?

Зачем?
Вы, видимо, меня не поняли. Вы, похоже, решили, что я предлагаю _дописывать_ сжатые данные в файл. Вы не правы. Я не зря назвал метод опасным. То, как вы меня поняли, было бы безопасно... если бы работало. Я же предлагаю писать _поверх_.

Не хотелось приводить команду целиком, чтобы кто-нибудь вдруг не применил её на важных данных, но...

truncate -s $( (dd if=file bs=256M | xz | tee >(wc -c >&3) | dd of=file conv=notrunc) 3>&1) file

Да, я в курсе, что если некоторый фрагмент файла, считая от начала, окажется после сжатия длиннее, чем до, то перезапишутся ещё не прочитанные данные. Поэтому я и написал, что метод нельзя применять, если вы не уверены в сжимаемости каждого фрагмента файла. И поэтому я написал, что читать нужно большими блоками (в примере - 256M): это несколько уменьшит "флуктуации" сжимаемости.
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение smaharbA »

т.е. обрезать и в подстановке сразу сжимать ?
если верно понимаю, то вариант

на текущтй момент действует авриант разбиение исходного файла с нумерацией от обратного и потоком последовательное сжате с удалением отправленного куска (файла)

спасибо (если верно понял) - сделаю и такой вариант Вами предложенный

и еще попутно - существует ли возможность создания из шела временных файлов - как FILE_ATTRIBUTE_TEMPORARY ?
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5405
ОС: Gentoo

Re: Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение /dev/random »

smaharbA писал(а):
28.08.2012 00:33
т.е. обрезать и в подстановке сразу сжимать ?
если верно понимаю, то вариант

Скорее, сжать и обрезать, а не обрезать и сжать, т.к. соманда truncate будет выполнена лишь после того, как отработает всё остальное.

* первая dd читает файл
* xz сжимает его
* tee копирует сжатый поток на счётчик wc
* вторая dd перезаписывает данные в файле сжатыми
* когда процесс завершается, wc выдаёт длину сжатых данных
* эта длина подставляется в truncate
* файл обрезается по этой длине.
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение smaharbA »

/dev/random писал(а):
28.08.2012 00:38
smaharbA писал(а):
28.08.2012 00:33
т.е. обрезать и в подстановке сразу сжимать ?
если верно понимаю, то вариант

Скорее, сжать и обрезать, а не обрезать и сжать, т.к. соманда truncate будет выполнена лишь после того, как отработает всё остальное.

* первая dd читает файл
* xz сжимает его
* tee копирует сжатый поток на счётчик wc
* вторая dd перезаписывает данные в файле сжатыми
* когда процесс завершается, wc выдаёт длину сжатых данных
* эта длина подставляется в truncate
* файл обрезается по этой длине.


не суть, понятно
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение drBatty »

smaharbA писал(а):
27.08.2012 22:35
Есть файл - пусть 20 Гб, на ФС 1 - 2 Гб свободного места. Предложите варианты сжатия исходного файла без привлечения внешних/сетевых носителей.
Файл должен быть сжат как единое целое, т.е. с возможностью его использования в приложениях.

no way в общем случае.

/dev/random писал(а):
27.08.2012 23:28
Есть (опасный) вариант: dd'шкой читаем файл большими блоками, передаём компрессору, другой dd'шкой пишем обратно без обрезания. В конце смотрим, сколько записалось, и обрезаем.

я-бы не стал пользоваться такими методами...


smaharbA писал(а):
28.08.2012 00:33
и еще попутно - существует ли возможность создания из шела временных файлов - как FILE_ATTRIBUTE_TEMPORARY ?

man 1 mktemp
не?
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
NickLion
Сообщения: 3408
Статус: аватар-невидимка
ОС: openSUSE Tumbleweed x86_64

Re: Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение NickLion »

Можно дополнить вариант /dev/random'а буфером во временном файле, если сжатый блок превысил размер исходного. Но на shell'е такое сделать, наверное, сложновато. Я бы на Си писал. Хотя может просто потому, что я его значительно лучше знаю.
Спасибо сказали:
smaharbA
Сообщения: 229
ОС: Windows Vista

Re: Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение smaharbA »

man 1 mktemp
не?


Нет, нужно что то подобное tmpfs, но как атрибут объекта (файла)
Я конечно далек от мысли...(с)
Спасибо сказали:
Аватара пользователя
Ленивая Бестолочь
Бывший модератор
Сообщения: 2760
ОС: Debian; gentoo

Re: Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение Ленивая Бестолочь »

NickLion писал(а):
28.08.2012 11:24
Можно дополнить вариант /dev/random'а буфером во временном файле, если сжатый блок превысил размер исходного. Но на shell'е такое сделать, наверное, сложновато. Я бы на Си писал. Хотя может просто потому, что я его значительно лучше знаю.

есть такое - stdbuf.
Солнце садилось в море, а люди с неоконченным высшим образованием выбегали оттуда, думая, что море закипит.
Спасибо сказали:
Ism
Сообщения: 1261
Статус: Никто, по сути быдло

Re: Предложите метод сжатия файла при отсутствии свободного места ФС

Сообщение Ism »

Все это садомазохизм.
Если у компа есть сеть, все решается netcat http://blog.vpsville.ru/blog/howto/10.html
Если usb , то большой флешкой.
Если DVD, то записью кусками
Спасибо сказали: