6

У меня около 12 ГБ изображений, составленных из примерно 2 миллионов файлов. Я бы хотел сжать их, чтобы упростить их передачу на сервер. Я просто планирую хранить файлы в zip-файлах для передачи, без сжатия. Helm присутствует на веб-сервере и может обрабатывать разархивированные файлы.

Я хотел бы указать программе на все эти файлы за один раз и заставить ее сжать их в файлы размером примерно 1 ГБ каждый, но каждый zip-файл должен быть независимым от других.

У меня установлен 7-zip с поддержкой разделения на тома, но эти тома зависят от того, будут ли они разархивированы.

У кого-нибудь есть предложения? Заранее спасибо!

6 ответов6

3

Я не знаю о программе, которая может сделать это, так как если вы делаете один zip в нескольких томах, все они будут связаны. Лучше всего сделать 12 папок и в каждой из них по 1 ГБ, а затем сжать папки по отдельности.

3

Бесплатное программное обеспечение для Windows под названием "Spinzip" должно делать эту работу для ваших целей! ;) http://skwire.dcmembers.com/wb/pages/software/spinzip.php

Он основан на IZARCC (автоматически включается в Spinzip). Вы должны проверить, но полный оригинальный путь может быть сохранен в заархивированных файлах!

До встречи

2

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

В случае, если это полезно для кого-то еще, вот мой сценарий:

import os
import csv
import shutil

def SplitFilesIntoGroups(dirsrc, dirdest, bytesperdir):
    dirno = 1
    isdircreated = False
    bytesprocessed = 0

    for file in os.listdir(dirsrc):
        filebytes = os.path.getsize(dirsrc+'\\'+file)

        #start new dir?
        if bytesprocessed+filebytes > bytesperdir:
            dirno += 1
            bytesprocessed = 0
            isdircreated = False

        #create dir?
        if isdircreated == False:
            os.makedirs(dirdest+'\\'+str(dirno))
            isdircreated = True

        #copy file
        shutil.copy2(dirsrc+'\\'+file, dirdest+'\\'+str(dirno)+'\\'+file)
        bytesprocessed += filebytes

def Main():
    dirsrc='C:\\Files'
    dirdest='C:\\Grouped Files'

    #1,024,000,000 = approx 1gb
    #512,000,000 = approx 500mb
    SplitFilesIntoGroups(dirsrc, dirdest, 512000000) 

if __name__ == "__main__":
    Main()
1

Хорошо, вот выход из этого, но не все так хорошо. Вы можете попробовать, если вам действительно нужно.

Допущения: вам нужно разделить 12 ГБ данных на 3 4 ГБ DVD.

Решение

  1. Возьмите 3 пустых флеш-накопителя размером 4 ГБ.
  2. Вставьте перьевой привод № 1.
  3. Теперь начните копировать всю папку на перьевой диск № 1, используя такой инструмент, как TeraCopy, который приостанавливает работу при возникновении некоторой ошибки и не прерывается.
  4. Когда ручка пера # 1 заполнена, она приостановится, и к тому времени вы сможете переключиться на ручку пера № 2.
  5. Теперь возобновите работу после загрузки флешки # 2.
  6. Повторите процедуру, начиная с шага 4, когда ручка привода № 2 заполнится. Просто увеличьте ручку привода #.

Теперь ваши данные разделены. Запишите их на DVD-диски или все, что вы хотите записать.

Если у вас нет 3-х дисковых накопителей, вы можете записать туда первый DVD-диск, а затем удалить все данные на перьевом накопителе, прежде чем возобновить процесс копирования.

0

SpinZip - это инструмент без сжатия. Я хотел использовать сжатие, поэтому результат был неудовлетворительным. Zipsplit не работает для файлов размером более 2 ГБ, поэтому я закончил писать свой собственный быстрый и грязный Perl-скрипт, который работает. Он добавляет файлы в архив, пока файл + архив ниже, чем макс. указанный размер:

# Use strict Variable declaration
use strict;
use warnings;
use File::Find;

# use constant MAXSIZE    => 4700372992; # DVD File size
use constant MAXSIZE    => 1566790997; # File size for DVD to keep below 2GB limit
# use constant MAXSIZE    => 100000000; # Test

use constant ROOTDIR    => 'x:/dir_to_be_zipped'; # to be zipped directory

my $zipfilename    = "backup"; # Zip file name
my $zipfileext    = "zip"; # extension

my $counter = 0;
my $zipsize = undef;
my $flushed = 1;

my $arr = [];

find({wanted =>\&wanted, no_chdir => 1}, ROOTDIR);

flush(@{$arr});

# Callback function of FIND
sub wanted {
    my $filesize = (-s $File::Find::name);

    LABEL: {
        if ($flushed) {
            $zipsize = (-s "$zipfilename$counter.$zipfileext");
            $zipsize = 0 unless defined $zipsize;

            printf("Filesize Zip-File %s: %d\n", 
                "$zipfilename$counter.$zipfileext", $zipsize);

            $flushed = 0;

            if (($zipsize + $filesize) >= MAXSIZE) {
                $counter++;
                $flushed = 1;
                printf("Use next Zip File %d, Filesize old File: %d\n",
                    $counter, ($zipsize + $filesize));
                goto LABEL;
            }
        }
    }

    if ( $zipsize + $filesize  < MAXSIZE ) {
        printf("Adding %s (%d) to Buffer %d (%d)\n",
            $File::Find::name, $filesize, $counter, $zipsize);

        push @{$arr}, $File::Find::name;
        $zipsize += $filesize;
    }
    else {
        printf("Flushing File Buffer\n");
        flush(@{$arr});

        $flushed = 1;
        $arr = [];
        goto LABEL;

    }
}

# Flush File array to zip file
sub flush {

    # open handle to write to STDIN of zip call
    open(my $fh, "|zip -9 $zipfilename$counter.$zipfileext -@")
        or die "cannot open < $zipfilename$counter.$zipfileext: $!";

    printf("Adding %d files\n", scalar(@_));
    print $fh map {$_, "\n"} @_;
    close $fh;
}
0

Теперь мы используем бесплатную программу под названием DirectorySlicer. Он создает "копии" (использует "жесткие ссылки", если место назначения совпадает с диском, поэтому не занимает больше места на диске), файлы в папки указанного размера. Это помогает нам создавать папки с файлами на компакт-диске объемом 700 МБ.

ЗАМЕЧАНИЕ ВНИЗ: файлы не обязательно находятся в том же порядке; это означает, что упорядоченные имена файлов (например, фотоизображения) могут быть распределены по "кускам", чтобы лучше соответствовать

Затем вы можете создавать ZIP-файлы для каждой папки.


Взгляните на http://bkprograms.weebly.com/folder-axe.html, это то, что мы использовали в прошлом, чтобы разделить пакет файлов на более мелкие куски, чтобы уместить их на DVD объемом 4,7 ГБ.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .