約200万のファイルで構成される約12GBの画像タイルがあります。サーバーへの転送を簡単にするために、これらを圧縮したいと思います。圧縮せずに、転送用にファイルをZipファイルに保存する予定です。 HelmはWebサーバー上に存在し、ファイルの解凍を処理できます。
プログラムを一度にすべてのこれらのファイルに向けて、それぞれ約1 GBのファイルに圧縮するようにしたいのですが、各Zipファイルは他のファイルから独立している必要があります。
7-Zipをインストールし、ボリューム間での分割をサポートしていますが、これらのボリュームは互いに依存して解凍されます。
誰か提案がありますか?前もって感謝します!
「Spinzip」と呼ばれるWindows上のフリーウェアはあなたの目的のために仕事をするはずです! ;) http://skwire.dcmembers.com/wb/pages/software/spinzip.php
これはIZARCC(Spinzipに自動的に含まれる)に基づいています。確認する必要がありますが、元の完全なパスがzipファイルに保存されている可能性があります。
じゃあ
複数のボリュームで1つのZipを作成している場合、それらはすべて関連しているため、これを実行できるプログラムを私は知りません。最善の策は、12個のフォルダーを作成し、それぞれにGBを入れてから、フォルダーを個別に圧縮することです。
最後に、簡単な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()
ここでOKはそれから抜け出す方法ですが、それほど良いわけではありません。本当に必要な場合は試すことができます。
前提条件:12GBのデータを3枚の4GBDVDに分割する必要があります。
ソリューション
これで、データが分割されました。 DVDや書きたいものに書いてください。
ペンドライブが3つない場合は、最初のDVDをそこに書き込んでから、コピープロセスを再開する前に、ペンドライブのデータ全体を削除できます。
SpinZipは、圧縮を行わないための厳密なツールです。圧縮を使用したかったので、結果は不十分でした。 Zipsplitは2GBを超えるファイルでは機能しないため、私は自分ですばやく汚い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;
}
現在、 DirectorySlicer というフリープログラムを使用しています。ファイルを指定されたサイズのフォルダに「コピー」します(宛先が同じドライブの場合は「ハードリンク」を使用するため、ドライブ領域を消費しません)。これは、700MBのCDに収まるファイルのフォルダーを作成するのに役立ちます。
ダウンサイドに注意:ファイルは必ずしも同じ順序である必要はありません。つまり、シーケンスされたファイル名(写真画像など)は、より適切にフィットするように「チャンク」全体に分散される可能性があります
その後、各フォルダのZipファイルを作成できます。
見てください http://bkprograms.weebly.com/folder-axe.html これは、4.7GBに収まるようにファイルのバッチを小さなチャンクに分割するために過去に使用したものです。 DVD。