DVDに記録したいメディアファイルがたくさんありますが、各DVDは4.5GBしか収まらないため、最小数のDVDを使用するようにファイルを整理する最適な方法を見つける必要があります(そうでない場合は、それぞれに空きスペースが残ります) DVDは簡単に追加できます)。これを支援するツールはありますか?
何年も前に、フロッピーディスクでこれを行うDOSユーティリティがありました。
無料でお試しください DVDスパン :
DVDスパンは、大きなフォルダの内容を複数のDVDに書き込むためのバックアップツールです。 DVD Spanは、最小数のディスクに最大量のデータを収めるために、各ディスクの最適な構成を自動的に決定できます。 DVDSpanは、音楽コレクション、写真、さらにはハードディスク全体をDVDにバックアップするための優れたツールです。また、通常のDVD(またはCD)を作成するため、バックアップの読み取りまたは復元に特別なソフトウェアは必要ありません。
ジェフ・シャトックの答えは、これが組み合わせ最適化問題と同等(または数学者が書いているように同型)であるということですが、1次元 ビンパッキング問題 と同等であり、 ナップサック問題)ではありません 。
幸運なことに、少なくともバージョン3.5の.NET FrameworkがインストールされているWindowsコンピューターにアクセスして、この問題を解決するコードを共有します。
まず、ダウンロードしてインストールします LINQPad 。
次に、ダウンロード 先ほど書いたLINQPadクエリ –これが生ファイルへのlinq(ha)です。 。linqファイルとして保存し、LINQPadで開きます。
パラメータを変更します。
変更する必要があるLINQPadクエリコードの部分は次のとおりです。
int binSizeMb = 4476; // This is the (floor of the) total size of a DVD+R reported by CDBurnerXP. string rootFileFolderPath = @"F:\2006 - Polyester Pimpstrap Intergalactic Extravaganza multicam";
binSizeMb
を「ビン」のサイズに変更します。例: CD、DVD、例CDの場合はint binSizeMb = 650;
。
注– binSizeMb
値は、 メビバイト と呼ばれることもあるものとして解釈されます。私の子供時代とは逆に、すべてのバイトの倍数が「バイナリ」であった場合、「MB」は「10進メガバイト」または正確に1,000,000バイトを指すことがあります。 。これを変更したい場合は、コードのconst int bytesPerMb = 1048576;
行をconst int bytesPerMb = 1000000;
に変更してください。
rootFileFolderPath
を、「ビンにパックする」ファイルを含むフォルダーのフルパスに変更します。 string rootFileFolderPath = @"C:\MySecretBinFilesFolder";
。
いずれかを押してクエリを実行します F5 または、クエリタブの左上にある実行ボタンをクリックします。
クエリコードは、rootFileFolderPath
フォルダー内のすべてのファイルを再帰的に列挙します。つまり、すべてのサブフォルダー内のファイルも含まれます。
次に、各ビン内のすべてのファイルの合計サイズが指定されたビンサイズ以下になるように、ファイルの「ビン」を作成します。
LINQPadの結果ペインに2つのリストが表示されます。
最初のリストは、検出されたすべてのファイルのリストであり、サイズの降順でリストされています。
2番目のリストは、「ファイルのパック」によって作成されたビンであり、ファイルとそのサイズ、およびビンの残りのサイズのリストが含まれています。
これは、2番目のリストと作成された最初の2つのビンを示すスクリーンショットです。
ウィキペディアによると、私が使用したアルゴリズム– First Fit Decreasing(FFD)戦略–はそれほど悪くないはずです。ウィキペディアは次のように述べています。
2007年には、FFDの11/9 OPT +6/9の限界が厳しいことが証明されました。
「OPT」は、最適な戦略を指します(特定の実際の戦略ではなく、到達できない可能性のあるものとして)。
関係する数学用語の私のややあいまいな記憶に基づくと、これは、FFD戦略が、最悪の場合、最適な戦略の約1.22倍のビン数にアイテムをパックする必要があることを意味するはずです。したがって、この戦略では、アイテムを4つではなく5つのビンにパックする可能性があります。特定の「病理学的」アイテムサイズを除いて、パフォーマンスは最適に非常に近い可能性が高いと思います。
同じウィキペディアの記事には、 "正確なアルゴリズム" があるとも記載されています。私もそれを実装することにするかもしれません。最初にアルゴリズムを説明している論文を読む必要があります。
また、さまざまなディスクにコピーするファイルとディレクトリを選択するDiscfitを試してください。
何年も前に私はそのようなタスクを実行するためにPHPスクリプトを書きました: https://bitbucket.org/borszczuk/php-backup-maker/
プログラムのバリエーションの1つを HitchhikerのHaskellガイド で使用できます。おそらく、そのチュートリアルの一部を実行した後です。チュートリアルは、チュートリアルの 第3章 からの次の節で例示されているように、複数のディスクに物事を分散するという問題を正確に解決することを中心に書かれています。
すでに十分な予備知識。いくつかのCDを詰めに行きましょう。
ご存知かもしれませんが、私たちの問題は古典的な問題です。それは「ナップサック問題」( グーグルアップ 、それが何であるかまだわからない場合は)と呼ばれます。 100000以上のリンクです)。
欲張りな解決策から始めましょう...
これは同様の質問です(同じではありませんが、最適化は求められていません)。ここで、タスクに役立つソリューション/プログラムを見つけることができます(投稿される場合)。
一般に、Haskellコードは非常に表現力があり(Haskellは高レベルの抽象化でプログラミングするための言語であるため)、したがって簡単に把握できます。
いずれかのソリューションのコードを見るときは、チュートリアルの 第1章 にあるように、作成するプログラムのトップレベルの構造が非常に単純であることを忘れないでください。
ここで、プログラムがどのように動作し、疑似コードで表現するかについて少し考えてみましょう。
main = Read list of directories and their sizes. Decide how to fit them on CD-Rs. Print solution.
合理的に聞こえますか?私はそうだと思いました。
私たちの生活を少し単純化して、今のところ、プログラムの外部のどこかでディレクトリサイズを計算すると仮定しましょう(たとえば、 "
du -sb *
")そしてstdinからこの情報を読んでください。
ソリューションの各部分をさらに詳しく見ていきます。
アーカイブの分割を可能にする任意の圧縮ツールを使用できると思います