|
Сжать файл 21 Гб при наличии свободного места 1.7 Гб | ☑ | ||
---|---|---|---|---|
0
smaharbA
24.05.12
✎
15:37
|
Выкладывайте идеи, как осуществить не вынося файл наружу
можно резать конечно кусочки с гнать их в гзип потоком, но при возникновении коллизии можно потерять кусок. Пока кубатурю, давайте идеи. |
|||
1
ЧеловекДуши
24.05.12
✎
15:38
|
Флешку на 32 Гб не предлагать?
|
|||
2
ЧеловекДуши
24.05.12
✎
15:39
|
http://narod.yandex.ru/ - один файл 2 Гб
|
|||
3
Fragster
гуру
24.05.12
✎
15:39
|
сначала хотел написать про поток, но потом прочитал топик. чего ты боишься там потерять?
|
|||
4
Fragster
гуру
24.05.12
✎
15:39
|
(3)+ резать вообще не надо, прямо сразу жать
|
|||
5
ЧеловекДуши
24.05.12
✎
15:40
|
В общем, реж файл на 22 куска по 1-му гигу, и как только один файл испечешь, то тут же его сливай на файло обменик
|
|||
6
ЧеловекДуши
24.05.12
✎
15:40
|
||||
7
Fragster
гуру
24.05.12
✎
15:40
|
а вообще непонятно, где этот файл? где-то в сети? или тебе его куда-то в сеть надо положить?
|
|||
8
smaharbA
24.05.12
✎
15:40
|
(1) нет
(4) предлагаю проделать и выложить описание действий |
|||
9
palpetrovich
24.05.12
✎
15:41
|
ужас. и где люди такие проблемы находят при таких скромных рессурсас... :)
|
|||
10
smaharbA
24.05.12
✎
15:41
|
(5) файлообменники не укладываются в условие сабжа
|
|||
11
ЧеловекДуши
24.05.12
✎
15:41
|
(7)Гдето в Инете, на удаленку :)
|
|||
12
ЧеловекДуши
24.05.12
✎
15:42
|
(10)Ты поясни, ты куда и откуда качаешь?
Ну по сабжу явно не локально :) |
|||
13
smaharbA
24.05.12
✎
15:42
|
(7) в сабже все написано
Сжать файл 21 Гб при наличии свободного места 1.7 Гб ... не вынося файл наружу |
|||
14
smaharbA
24.05.12
✎
15:42
|
(12) все происходит в пределах локальной файловой системы
|
|||
15
ЧеловекДуши
24.05.12
✎
15:43
|
(13)Не вынося файл наружу, чего ты от него хочешь получить?
|
|||
16
ЧеловекДуши
24.05.12
✎
15:43
|
(14)Конечный результат?
|
|||
17
ЧеловекДуши
24.05.12
✎
15:43
|
Типо распаковать его?
|
|||
18
Fragster
гуру
24.05.12
✎
15:44
|
(14) тогда не понял, просто травишь на него что тебе больше нравится, и всё
|
|||
19
smaharbA
24.05.12
✎
15:46
|
+(13) т.е. имеется файл на фс размером 21 Гб, и имеется на той же фс 1.7 Гб свободного места
нужно сжать в гзип не прибегая к внешним ресурсам |
|||
20
aristar
24.05.12
✎
15:46
|
(0) оперативки сколько на машине?
|
|||
21
smaharbA
24.05.12
✎
15:47
|
(20) 1 Гб
|
|||
22
Fragster
гуру
24.05.12
✎
15:47
|
(19) а, результат типа больше 21 гига?
|
|||
23
Fragster
гуру
24.05.12
✎
15:47
|
в смысле 1.7
|
|||
24
palpetrovich
24.05.12
✎
15:48
|
(19) типа упаковывать с удалением "использованного" куска из оригинала? ...какмикадзе :)
вообще это "вопрос на засыпку" или "реальная задача"? |
|||
25
ЧеловекДуши
24.05.12
✎
15:48
|
(19)А сейчас он чем сжат?
|
|||
26
zahar140382
24.05.12
✎
15:48
|
он издевается)))
|
|||
27
Fragster
гуру
24.05.12
✎
15:48
|
(26) да не, в принципе, задача интересная
|
|||
28
smaharbA
24.05.12
✎
15:49
|
(24) как бы реальная, но и на засыпку
|
|||
29
smaharbA
24.05.12
✎
15:49
|
(25) ничем
|
|||
30
zahar140382
24.05.12
✎
15:49
|
у меня в телефоне флеха 32г неужели трудно найти временный диск чето похоже на прикол
|
|||
31
palpetrovich
24.05.12
✎
15:50
|
ну если это, к примеру, файл txt - порезать его на 22 куска да и заархивировать каждый
|
|||
32
ЧеловекДуши
24.05.12
✎
15:51
|
Если ни чем, то частично сжимая, удаляй :)
Напиши свой gzip ;) |
|||
33
zahar140382
24.05.12
✎
15:51
|
почему на 22 у него еще оперативы 1 гиг)))
|
|||
34
ЧеловекДуши
24.05.12
✎
15:51
|
(30)Ну, человеку делать нечего в конце рабочего дня :)
|
|||
35
Fragster
гуру
24.05.12
✎
15:53
|
(30) а если оно в датацентре в германии?
|
|||
36
Jstunner
24.05.12
✎
15:53
|
разделить файл на 20 равных кусков и паковать под присмотром человека с грязной ухмылкой и паяльником в руках, точно ничего не потеряется
|
|||
37
zahar140382
24.05.12
✎
15:55
|
бери делай многотомный архив как уже сказали 22 части как только сделалась первая часть лей ее куда нить(и удаляй на диске) итд
|
|||
38
Партизан
24.05.12
✎
15:55
|
(0) файл-то хорошо сжимаемый?
можно попробовать для начала атрибут "сжатый", глядишь и место освободится |
|||
39
zahar140382
24.05.12
✎
15:56
|
если это в датацентре способ подайдет инет там точно есть))) раз ты подключаешься
|
|||
40
ЧеловекДуши
24.05.12
✎
15:56
|
Шаги:
1. Выворачиваешь файлы на изнанку, т.е. битики наоборот (оригиналы удаляешь) 2. Упаковываешь файлы (перевертыши) в gzip, начиная с конца (ну если gzip - так не может, то найчи его ;)) 3. Наслаждаешься... многими файлами |
|||
41
zahar140382
24.05.12
✎
15:56
|
а может на диски мусор удалить
|
|||
42
zahar140382
24.05.12
✎
15:57
|
раз датацент в Германии порно там море
|
|||
43
zahar140382
24.05.12
✎
15:57
|
)))
|
|||
44
Партизан
24.05.12
✎
15:57
|
(0) каков прогнозируемый конечный размер файла?
|
|||
45
Fragster
гуру
24.05.12
✎
15:58
|
ну в идеале - берем отправляем первый гиг/полгига файла в поток архиватору, осатнавливаемся, потом отрезаем первый гиг, повторяем. но программу всё равно писать надо, потому как я не знаю, как не в сях ставить на паузу поток, а потом что-то еще делать и возвращаться к нему же :)
|
|||
46
Fragster
гуру
24.05.12
✎
15:58
|
(22) 20 гиг, видимо
|
|||
47
Fragster
гуру
24.05.12
✎
15:59
|
(45)+ и не дай бог что-то пойдет не так :)
|
|||
48
zahar140382
24.05.12
✎
16:00
|
открыть в WinHex и на печать)))
|
|||
49
Fragster
гуру
24.05.12
✎
16:00
|
(47)+ хотя если выходной поток архиватора оперативно сохранять - то восстановить потом можно будет
|
|||
50
ЧеловекДуши
24.05.12
✎
16:00
|
(45)Резать можно только с конца, как ни крути :)
Хотя ХЗ, если получить доступ к файловой системе, то можно. Автор не назвал ОС-ь :) |
|||
51
Jump
24.05.12
✎
16:03
|
Читаем последние полгига в файл. Файл сохраняем, исходные полгига в оригинально файле удаляем.
Повторяем пока файл не кончиться. Пакуем куски в архив, удаляя уже упакованные. |
|||
52
Fragster
гуру
24.05.12
✎
16:03
|
(50) да и пофиг, можно с конца, просто потом немного сложнее клеить
|
|||
53
ЧеловекДуши
24.05.12
✎
16:03
|
(51)Как понять, кто был первым и когда? :)
|
|||
54
ЧеловекДуши
24.05.12
✎
16:04
|
(52)Клеить не надо.
Автор хочет gzip - архив и усе, вместо файлов :) |
|||
55
ЧеловекДуши
24.05.12
✎
16:08
|
+ Судя по вики wiki:Gzip
Это один файл - один архив :) |
|||
56
palpetrovich
24.05.12
✎
16:09
|
(50) +1 та да, кажись речь про nix
|
|||
57
aristar
24.05.12
✎
16:09
|
(0) ща скрипт дам
|
|||
58
vde69
24.05.12
✎
16:11
|
теоретически я-бы разделил задачу на три этапа
1. сделать из одного обьекта (файла) много мелких (с проверкой возможности собрать обратно) тут думаю правильно пойти путем простого изменения фат таблиц (то есть физически данные остаются на своих местах) 2. архивирование собствено этих кусочков это просто 3. склеивание заархивированых кусков в один большей файл это наверно сложно, по сколько алгоритм склейки должен идти "кусочками" (сначало кусочки из 2х фрагментов, после склейки, проверяем и удаляем и так далее) для такой склейки место (включая исходник) должно быть 1.5 от конечного размера |
|||
59
Fragster
гуру
24.05.12
✎
16:12
|
(58) достаточно просто можно в архиватор загнать все маленькие файлы одним потоком
|
|||
60
vde69
24.05.12
✎
16:15
|
(59) как я понял в архиве должен быть ОДИН файл
|
|||
61
Jump
24.05.12
✎
16:16
|
(53)А что там понимать?
При разрезании нумеруешь файлы. При архивации начинаешь с самого большого номера, и по убыванию |
|||
62
vde69
24.05.12
✎
16:16
|
(59) ну и еще, практически все архиваторы работают с копией а это 2х запас свободного диска
|
|||
63
palpetrovich
24.05.12
✎
16:16
|
(59) Gzip вроде не умеет много файлов в один
|
|||
64
Fragster
гуру
24.05.12
✎
16:16
|
(60) я так и сказал, по очереди отправляем файлы в поток - для архиватора это выглядит как один файл
|
|||
65
Jump
24.05.12
✎
16:17
|
(60)Ну можно по очереди читать маленькие файлы и поток подавать на архиватор.
При конце каждого файла удалять его. |
|||
66
Попытка1С
24.05.12
✎
16:17
|
(60) Только ему придется после архивирования кусочком исходные куски удалять.
|
|||
67
Попытка1С
24.05.12
✎
16:17
|
*кусочков
|
|||
68
Fragster
гуру
24.05.12
✎
16:18
|
(62) это в винде. в линуксе же есть входящий и исходящий потоки, в один мы шлем файлы как куски мяса в мясорубку, а из второго - пишем на диск
|
|||
69
Fragster
гуру
24.05.12
✎
16:18
|
(66) прямо в процессе можно
|
|||
70
Fragster
гуру
24.05.12
✎
16:18
|
(68)+ ничего не мешает нам сделать это на одной тарелке
|
|||
71
Jump
24.05.12
✎
16:18
|
(62)Что значит с копией? В темпе создают?
Ну а касательно запаса - если разбивать на куски размером в 100мегабайт, и удалять при прочтении, то места с избытком будет. |
|||
72
Базис
naïve
24.05.12
✎
16:21
|
В аналогичной ситуации я зашёл к админам и спросил флешку, сказал "нужно для работы". Отдали 4-гиговую. Быстро и без выноса мозга.
Если у вас всё так плохо (заставляют чинить БП, не дают на апгрейд) - шли резюме, у нас постоянно набирают сотрудников. Зеленоград, 20 км от остальной части Москвы. Если хорошо шаришь в аналоговой или цифровой обработке - тем более приходи. |
|||
73
Длинный Клиент
24.05.12
✎
16:33
|
(51) +1
|
|||
74
smaharbA
24.05.12
✎
16:41
|
исходный файл один, выходной файл так же один
|
|||
75
smaharbA
24.05.12
✎
16:43
|
можно конечно сплитнуть и покусочно, как в сабже и сказано
но интереснее "прозрачно" и без компиляций, думаю как трансатнуть не с конца, а сначала |
|||
76
Зеленый Кот
24.05.12
✎
16:49
|
скинемся абрахамсу на флешку 32 гига?
|
|||
77
Зеленый Кот
24.05.12
✎
16:50
|
могу подарить, но ехать далеко
|
|||
78
shamannk
24.05.12
✎
16:51
|
вспомнилась попа и фортачка....
|
|||
79
Партизан
24.05.12
✎
17:27
|
(74) конечный файл куда девать будешь? / сколько он места займет? файловая система какая
|
|||
80
aristar
24.05.12
✎
17:33
|
Держи скрипт на bash
Первый параметр - имя входного файла. Второй - количество блоков по 1K, третий - префикс набора архивов. По-умолчанию outfile в текущем каталоге. Должно сработать. Но у тебя будет только одна возможность это проверить, ибо исходный файл режется в 0 :) #!/bin/bash file=$1 bc=${2-10000} outprefix=${3-outfile} fsize=`ls -l $file | awk '{print $5}'` sp=0 bend=0 bn=$(($fsize/($bc*1024))) for ((c=$bn;c>=0;c--)); do let sp=c*bc let bend=(c+1)*bc*1024 let tosize=sp*1024 echo \($c\) Starting at block $sp \( $tosize\) ending at offset $bend dd if=$file bs=1K skip=$sp count=$bc | gzip -f > $outprefix$(($c+1)).gz truncate -s $tosize $file done |
|||
81
aristar
24.05.12
✎
17:35
|
(80) это для smaharbA, что было изначально запрошено в (0)
|
|||
82
aristar
24.05.12
✎
17:57
|
(80)+ в общем если вторым параметром задать миллион, то скрипт будет последовательно с конца архивировать каждый гигабайт исходного файла, а потом его отрезать.
Чтобы обратно потом распаковать такой архив надо выполнить команду for f in {1..n}; do gzip -d -f -c outfile$f.gz >> unpacked_file_name; done где n - максимальный номер архива. |
|||
83
Lionee
24.05.12
✎
19:03
|
Вопроса небыло еще ,а зачем он хочпет так сделать ,файлик утащить куда нить ?
|
|||
84
smaharbA
25.05.12
✎
06:24
|
(80) это может быть значительно просче, сплит и потоком все куски в гзип, поправи трункат на обрезку с начала файла
|
|||
85
smaharbA
25.05.12
✎
06:25
|
(82) нужен обычный архив, что бы файл продолжал работать в составе системы
|
|||
86
IVIuXa
25.05.12
✎
06:43
|
(0)
mount -t tmpfs -o size=xxxM tmpfs /mnt/tmpfs/ неее ? |
|||
87
IVIuXa
25.05.12
✎
06:57
|
+(86)
еще вариант chattr -c /home/bigfile.this |
|||
88
smaharbA
25.05.12
✎
10:31
|
(86) и что это даст если размер файла превышает размер памяти и свободного пространства в десятки раз ?
|
|||
89
smaharbA
25.05.12
✎
10:33
|
сплитнуть можно так, а если перлом то можно обойтись без временных файлов и гзипать прямо в имеющийся файл и вконце отрезать
#!/bin/sh file=xxx prefix=${file}.$$ x=0 size=`wc -c ${file} | cut -d' ' -f1` split=$((1024 * 1024 * 10)) x=$((${size} / ${split} + 1)) while [ ${size} -ge ${split} ]; do tail -c ${split} ${file} > ${prefix}.`printf '%010d' ${x}` size=$((${size} - ${split})) truncate -s ${size} ${file} x=$((x-1)) done mv ${file} ${prefix}.`printf '%010d' ${x}` for x in ${prefix}.*; do cat ${x} rm ${x} done | gzip -c > ${file}.gz |
|||
90
smaharbA
25.05.12
✎
11:14
|
Жму - жду.
|
|||
91
aristar
25.05.12
✎
11:22
|
(84) не видел у truncate возможности обрезки с начала файла.
(85) А вот это непонятно. Исходный файл нельзя резать? Или нужен один архивный файл в итоге? (89) Согласен. Тоже можно. Но менее эффективно чем сразу делать tail -c ${split} ${file} | gzip -c > ${prefix}.`printf '%010d' ${x}`.gz Потому как фактически вначале надо скопировать 21Гб, а потом только сжать. А если сжимать по кускам - копирования лишнего не будет. |
|||
92
smaharbA
25.05.12
✎
11:24
|
(91) нужен единый файл, перлом делается трункат и от начала, родной трункат переписывается вполне и на обрезку начала
|
|||
93
aristar
25.05.12
✎
11:25
|
(92) Для чего нужен единый файл? Для передачи по сети?
Если уж очень хочется получить один файл в конечном итоге, то кучу фрагментов можно собрать в один for x in ${prefix}.*; do cat ${x} rm ${x} done | tar cf > ${file}.gz.tar |
|||
94
smaharbA
25.05.12
✎
11:27
|
(93) для продолжения работы приложения с ним как если бы он не был сжат
|
|||
95
aristar
25.05.12
✎
11:35
|
(94) Для работы с файлом, как с единицей хранения информации, или для работы с файлом с целью модификации/чтения данных из него?
|
|||
96
smaharbA
25.05.12
✎
11:36
|
это файлы ВМ
|
|||
97
smaharbA
25.05.12
✎
11:37
|
(93) только не "tar cf > ${file}.gz.tar"
а tar czf > ${file}.tar.gz но мне не нужен тар, нужен простой гзип или бзип |
|||
98
Dmitry77
25.05.12
✎
11:42
|
В общшем в (0) ищуются острые ощущения. Например любой сбой с случае данной операции (например отключение питания) и исходный файл более не востановиться. цена вопроса - любой внешний носитель на 20 гигабайт - начиная от 800 рублей.
|
|||
99
smaharbA
25.05.12
✎
11:47
|
(98) Вы уверены о 800 руб и возможности подключения носителей вообще ?
|
|||
100
Dmitry77
25.05.12
✎
11:52
|
(99) не встречал устройств с объемов данных в 21 гиг, которые бы туда попали вручную -> эта информация занесена из вне - > существует интерфейс с внешними устройсвами -> надо искать внешнее устройство с свободным объхемом памяти и копировать туда.
|
|||
101
smaharbA
25.05.12
✎
11:53
|
+ в случае метода из (89) никакой сбой не повлияет на данные
|
|||
102
smaharbA
25.05.12
✎
11:53
|
(100) см (96)
|
|||
103
aristar
25.05.12
✎
12:00
|
(96) т.е. задача - сжать файлы VM, чтобы она продолжила работать с ними в сжатом виде?
|
|||
104
smaharbA
25.05.12
✎
12:01
|
а теперь решите обратную задачу
заведомо известно, что свободное место + размер сжатого достаточны для получения распакованного экземпляра. |
|||
105
smaharbA
25.05.12
✎
12:03
|
(103) она может работать со сжатыми в гзип
можно конечно было смонтировать какую нибудь гозип (расширяемую) и кусками писать в нее, но не всегда есть возможность использования сжатых ФС в виде файлов, по тому и интереснее в регулярный файл. |
|||
106
aristar
25.05.12
✎
12:27
|
(104)... но свободного места меньше, чем размер распакованного? :)
|
|||
107
IVIuXa
25.05.12
✎
14:28
|
(105)
твой вариант Btrfs со сжатием и не выноси мозг... |
|||
108
IVIuXa
25.05.12
✎
14:34
|
+(107)
причем судя по вечной нехватке ресурсов на всех машинах :) |
|||
109
smaharbA
25.05.12
✎
14:54
|
(107) и как поможет btrfs ? после отправки очередного куска делать ресайз и дефраг ?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |