Dosyaları birden fazla DVD'ye en uygun şekilde dağıtmak için yardımcı program?


11

DVD'ye kaydetmek istediğim bir sürü medya dosyam var, ancak her DVD yalnızca 4,5 GB'a uyduğundan, minimum sayıda DVD kullanmak için dosyaları düzenlemenin en uygun yolunu bulmam gerekiyor (aksi takdirde her birinde boş alan kalıyor) DVD kolayca ekleyebilirsiniz). Bu konuda yardımcı olacak herhangi bir araç var mı?

Yıllar önce bunu disketlerle yapmak için bir DOS yardımcı programı vardı.


1
Hayır, sıkıştırma ve bölme aramıyorum. Her diskin doğrudan kullanılabilmesi için dosyaları yerel olarak (dosya sistemi) dağıtmak istiyorum.
Alex R

Bunun, arayan herkes için iyi bir sayfa olduğunu hissettim: howtogeek.com/76264/…
Nav

Yanıtlar:


3

Ücretsiz DVD Span'ı deneyin :

DVD Span, büyük klasörlerin içeriğini birden fazla DVD'ye yazmak için bir yedekleme aracıdır. DVD Span, minimum disk sayısına maksimum miktarda veri sığdırmak için her diskin en iyi organizasyonunu otomatik olarak belirleyebilir. DVDSpan, müzik koleksiyonunuzu, fotoğraflarınızı ve hatta tüm sabit diskinizi DVD'lere yedeklemek için harika bir araçtır. Normal DVD'ler (veya CD'ler) ürettiği için yedeklerinizi okumak veya geri yüklemek için özel bir yazılıma gerek yoktur.


2

Ah, Sırt Çantası problemi . Ben sadece bunun için bir çevrimiçi çözücüsü bulabiliriz burada . Sırt çantanızın boyutu 4,5 GB ve her paketin dosya boyutları olacaktır. Özel uygulamanıza uyacak şekilde çıkışına biraz masaj yapmanız gerekecek, ancak uygulanabilir olmalıdır. Bu çok hızlı çalışmayacak, çünkü bu problem zor .


Evet aslında NP-tam bir problem, ancak bu pratik uygulama için kaba kuvvetli bir çözüm yeterince hızlı :)
Alex R

1
Bu, sırt çantası sorununa değil, tam bir algoritmanın olduğu (1-D) bin paketleme sorununa eşdeğerdir .
Kenny Evitt

2

genel bakış

Jeff Shattock'un cevabı, bunun bir kombinatoryal optimizasyon problemine eşdeğer (veya matematikçilerin yazdığı gibi izomorfik) olduğu doğrudur, ancak sırt çantası problemine değil, 1 boyutlu çöp kutusu paketleme problemine eşdeğerdir .

Şanslıyız, .NET Framework'ün en az 3.5 sürümü yüklü bir Windows bilgisayara erişimi olan bu sorunu sizin için veya başka herhangi bir kişi için çözecek bazı kodlarım var.

Kaba Bir Çözüm

  1. İlk olarak, LINQPad'i indirin ve yükleyin .

  2. İkincisi, az önce yazdığım LINQPad sorgusunu indirin - işte ham dosyaya linq (ha). Bir .linq dosyası olarak kaydedin ve LINQPad'de açın.

  3. Parametreleri değiştirin:

    LINQPad sorgu kodunda değiştirmeniz gereken kısım:

    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";

    Değişim binSizeMbiçin 'bin', örneğin CD, DVD, eski boyutuna. int binSizeMb = 650;CD için.

    Not - binSizeMbdeğer, bazen mebibit olarak adlandırılan şey olarak yorumlanır . Çocukluğumun aksine, tüm bayt katları 'ikili' olduğunda, bazen 'MB' artık kodumda kullanılan 1.048.576 baytlık bir mebibitin (MiB) aksine, 'ondalık megabayt' veya tam olarak 1.000.000 bayt anlamına gelir. . Bunu değiştirmek isterseniz const int bytesPerMb = 1048576;, koddaki satırı olarak değiştirin const int bytesPerMb = 1000000;.

    rootFileFolderPath'Kutulara paketlemek' istediğiniz dosyaları içeren klasörün tam yolunu değiştirin , örn. string rootFileFolderPath = @"C:\MySecretBinFilesFolder";.

  4. Sorguyu, sekmenin sol üst tarafındaki Yürüt düğmesine basarak F5veya tıklayarak çalıştırın .

Sonuçlar

Sorgu kodu, rootFileFolderPathklasördeki tüm dosyaları yinelemeli olarak numaralandıracaktır , yani tüm alt klasörlerde de dosyaları içerecektir.

Ardından, her bölmedeki tüm dosyaların toplam boyutu belirtilen bölme boyutundan küçük veya ona eşit olacak şekilde dosyalar için 'bölmeler' oluşturur.

LINQPad sonuçlar bölmesinde iki liste göreceksiniz.

İlk liste, boyutuna göre azalan sırada listelenen tüm dosyaları listeler.

İkinci liste 'dosyaların paketlenmesi' ile oluşturulan dosyaların, dosyaların ve boyutlarının yanı sıra çöp kutusunun kalan boyutu ile birlikte oluşturulan bölmelerdir.

İşte ikinci listeyi ve oluşturulan ilk iki kutuyu gösteren bir ekran görüntüsü:

Kutuların listesini gösteren LINQPad ekran görüntüsü

Lanetli Analiz

Wikipedia'ya göre, kullandığım algoritma - İlk Uyum Azaltma (FFD) stratejisi - çok kötü olmamalı; Wikipedia belirtileri:

2007'de FFD için bağlı 11/9 OPT + 6/9'un sıkı olduğu kanıtlandı.

'OPT' optimal stratejiyi ifade eder (herhangi bir gerçek strateji değil, potansiyel olarak erişilemeyen bir şey olarak).

İlgili matematiksel terimlerdeki biraz bulanık anılarıma dayanarak, bu FFD stratejisinin en kötü ihtimalle, optimal bir stratejinin yapabileceği kutu sayısının ~ 1,22 katına kadar öğeleri paketlemesi gerektiği anlamına gelmelidir. Bu nedenle, bu strateji 4 yerine 5 kutuya ürün koyabilir. Performansın belirli 'patolojik' ürün boyutları hariç en uygun seviyeye yakın olduğundan şüpheleniyorum.

Aynı Wikipedia makalesi aynı zamanda bir "tam algoritma" olduğunu belirtir . Bunu da uygulamaya karar verebilirim. Önce algoritmayı tanımlayan makaleyi okumam gerekecek.


0

Bence bir arşivin bölünmesine izin veren herhangi bir sıkıştırma aracı kullanabilirsiniz


1
Sıkıştırma aradığım şey değil. Bu, dosyalara erişmek için çok hantal hale getirir.
Alex R

0

Otostopçunun Haskell rehberindeki programın varyantlarından birini , belki de bu öğreticinin bir kısmı üzerinde çalıştıktan sonra alabilirsiniz; öğretici, bazı bölümlere şeyleri dağıtma sorununuzu tam olarak çözme etrafında yazılmıştır, buradaki çözüm, öğreticinin 3. Bölümünden aşağıdaki pasajda gösterildiği gibi, artımlı olarak rafine edilmiştir :

Zaten yeterince ön hazırlık. hadi bazı CD'leri paketleyelim.

Zaten fark etmiş olabileceğiniz gibi, sorunumuz klasik bir sorundur. Buna "sırt çantası sorunu" denir ( zaten ne olduğunu bilmiyorsanız google it up . 100000'den fazla bağlantı var).

açgözlü çözümden başlayalım ...

Daha fazla fikir: ilgili soru

İşte benzer bir soru (aynı olmasa da: orada optimizasyon istenmiyor), göreviniz için daha yararlı çözümler / programlar bulabileceğiniz (gönderilecekse):

Önerilen eğitimde programlamanın anlaşılması için bazı ipuçları

Genel olarak, Haskell kodu oldukça etkileyici (Haskell yüksek düzeyde bir soyutlama için programlama dili olduğu için) ve bu nedenle kolayca kavranabilir.

Çözümlerden birinin koduna bakarken, yazmak istediğimiz programın üst düzey yapısının , öğreticinin 1. Bölümünde belirtildiği gibi oldukça basit olduğunu unutmayın :

Şimdi bir an için programımızın nasıl çalışacağını düşünelim ve programı sahte kodda ifade edelim:

main = Read list of directories and their sizes.
       Decide how to fit them on CD-Rs.
       Print solution.

Kulağa makul geliyor mu? Ben de öyle düşünmüştüm.

Hayatımızı biraz basitleştirelim ve şimdilik program boyutlarımızın dışında bir yerde (örneğin, " du -sb *" ile) dizin boyutlarını hesaplayacağımızı ve bu bilgileri stdin'den okuyacağımızı varsayalım .

ve çözümün bölümlerine daha yakından bakın.



0

Ayrıca, çeşitli disklere kopyalamak için dosya ve dizinleri seçen Discfit'i deneyin:

https://sourceforge.net/projects/discfit/


Sadece bağlantı ile bir cevap iyi bir cevap değildir. Yazılım önerirken lütfen bu taslağı izleyin . Daha iyi hale getirmek için cevabınızı genişletmelisiniz ( düzenlemelisiniz ). Örneğin, cevabınız "ürünü nasıl kullanacağınız hakkında kısa bir genel bakış sunun ..." şartına uymuyor.
Kamil Maciorowski

Web sitesinden: "Minimum sayıda phisycal medya (CD, DVD, BD ...) parçalarını kullanmak için büyük bir dosya veya dizin kümesi düzenler. Elde edilen setleri doğrudan yazma yazılımınızın üzerine sürükleyebilirsiniz (Nero, DVD -Git...)".
Anton

Neredeyse. Cevabı daha iyi hale getirmek için cevabı düzenlemelisiniz.
Kamil Maciorowski

Yazarların yazdıklarından başka ekleyecek başka bir şey göremiyorum. Bir muhtemelen sadece web sitesine gidip sormak olabilir.
Anton

Bu iyi. Demek istediğim gerektiğidir düzenlemek cevap, ona "genişleme" ile değil yazma yorumunu. Bu ana hatları takip etmesi gereken cevaptır, cevap + yorumlar değil. Yorumda belirtilen parça cevabınızda belirtilmelidir. Bu kadar.
Kamil Maciorowski
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.