Tiện ích để phân phối tối ưu các tập tin vào nhiều DVD?


11

Tôi có một loạt các tệp phương tiện mà tôi muốn ghi vào DVD, nhưng vì mỗi DVD chỉ có 4,5 GB, tôi phải tìm cách tối ưu để sắp xếp các tệp để sử dụng số lượng DVD tối thiểu (nếu không thì còn trống DVD có thể dễ dàng thêm lên). Có công cụ nào để giúp với điều này?

Nhiều năm trước đã có một tiện ích DOS để làm điều này với các đĩa mềm.


1
Không, tôi không tìm cách nén và chia nhỏ. Tôi muốn phân phối các tệp nguyên bản (hệ thống tệp) để mỗi đĩa có thể được sử dụng trực tiếp.
Alex R

Chỉ cần cảm thấy rằng đây là một trang tốt cho bất cứ ai tìm kiếm: howtogeek.com/76264/ Kẻ
Nav

Câu trả lời:


3

Hãy thử Span DVD miễn phí :

DVD Span là một công cụ sao lưu để ghi nội dung của các thư mục lớn vào nhiều DVD. DVD Span có thể tự động xác định tổ chức tốt nhất của mỗi đĩa để phù hợp với lượng dữ liệu tối đa trên số lượng đĩa tối thiểu. DVDSpan là một công cụ tuyệt vời để sao lưu bộ sưu tập nhạc, ảnh hoặc thậm chí toàn bộ đĩa cứng của bạn vào DVD. Và bởi vì nó tạo ra các đĩa DVD (hoặc CD) thông thường, không cần phần mềm đặc biệt nào để đọc hoặc khôi phục bản sao lưu của bạn.


2

Ah, vấn đề Knapsack . Tôi chỉ có thể tìm thấy một người giải quyết trực tuyến cho việc này, ở đây . Kích thước ba lô của bạn sẽ là 4,5 GB và mỗi gói sẽ là kích thước tệp của bạn. Bạn sẽ cần phải xoa bóp đầu ra của nó một chút để phù hợp với ứng dụng cụ thể của bạn, nhưng nó hoàn toàn khả thi. Điều này sẽ không chạy rất nhanh, bởi vì vấn đề này là khó khăn .


Vâng thực sự đó là một vấn đề hoàn chỉnh NP, nhưng đối với ứng dụng thực tế này, một giải pháp vũ phu là đủ nhanh :)
Alex R

1
Điều này không tương đương với vấn đề ba lô nhưng vấn đề đóng gói thùng (1-D) , trong đó có một thuật toán chính xác .
Kenny Evitt

2

Tổng quat

Câu trả lời của Jeff Shattock là chính xác rằng điều này tương đương (hoặc đẳng cấu, như các nhà toán học viết) cho một vấn đề tối ưu hóa tổ hợp, nhưng nó tương đương với vấn đề đóng gói bin 1 chiều , không phải là vấn đề về ba lô .

May mắn cho bạn, tôi có một số mã để chia sẻ sẽ giải quyết vấn đề này cho bạn hoặc bất kỳ ai khác, với quyền truy cập vào máy tính Windows có cài đặt ít nhất phiên bản 3.5 của .NET Framework.

Một giải pháp thô

  1. Đầu tiên, tải xuống và cài đặt LINQPad .

  2. Thứ hai, tải xuống truy vấn LINQPad tôi vừa viết - đây là linq (ha) vào tệp thô. Lưu nó dưới dạng tệp .linq và mở nó trong LINQPad.

  3. Thay đổi các tham số:

    Đây là một phần trong mã truy vấn LINQPad bạn nên thay đổi:

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

    Thay đổi binSizeMbkích thước của 'bin' của bạn, ví dụ: CD, DVD, ví dụ. int binSizeMb = 650;cho một đĩa CD.

    Lưu ý - binSizeMbgiá trị được hiểu là những gì đôi khi được gọi là mebibyte . Trái ngược với thời thơ ấu của tôi, khi tất cả các bội số byte là 'nhị phân', đôi khi 'MB' bây giờ đề cập đến 'megabyte thập phân' hoặc chính xác là 1.000.000 byte, trái ngược với 1.048.576 byte của mebibyte (MiB), được sử dụng trong mã của tôi . Nếu bạn muốn thay đổi điều này, hãy thay đổi dòng const int bytesPerMb = 1048576;trong mã thành const int bytesPerMb = 1000000;.

    Thay đổi rootFileFolderPathđường dẫn đầy đủ của thư mục chứa các tệp bạn muốn 'đóng gói vào thùng', ví dụ: string rootFileFolderPath = @"C:\MySecretBinFilesFolder";.

  4. Chạy truy vấn bằng cách nhấn F5hoặc nhấp vào nút Thực thi ở phía trên bên trái của tab truy vấn.

Các kết quả

Mã truy vấn sẽ liệt kê tất cả các tệp trong rootFileFolderPaththư mục, theo cách đệ quy, có nghĩa là nó cũng sẽ bao gồm các tệp trong tất cả các thư mục con.

Sau đó, nó sẽ tạo 'thùng' cho các tệp sao cho tổng kích thước của tất cả các tệp trong mỗi thùng nhỏ hơn hoặc bằng kích thước thùng được chỉ định.

Trong khung kết quả LINQPad, bạn sẽ thấy hai danh sách.

Danh sách đầu tiên là tất cả các tệp mà nó tìm thấy, được liệt kê theo thứ tự giảm dần theo kích thước.

Danh sách thứ hai là các thùng được tạo bằng cách 'đóng gói các tệp', với một danh sách các tệp và kích thước của chúng, cũng như kích thước còn lại của thùng.

Đây là một ảnh chụp màn hình hiển thị danh sách thứ hai và hai thùng đầu tiên được tạo:

Ảnh chụp màn hình LINQPad hiển thị danh sách các thùng

Phân tích chữ thảo

Theo Wikipedia, thuật toán tôi đã sử dụng - chiến lược Giảm tốc độ phù hợp đầu tiên (FFD) - không nên quá tệ; Wikipedia nêu:

Vào năm 2007, người ta đã chứng minh rằng ràng buộc 11/9 OPT + 6/9 cho FFD là chặt chẽ.

'OPT' đề cập đến chiến lược tối ưu (như một thứ có khả năng không thể truy cập được, không phải bất kỳ chiến lược thực tế cụ thể nào).

Dựa trên những ký ức có phần mờ nhạt của tôi về các thuật ngữ toán học có liên quan, điều này có nghĩa là chiến lược FFD, tệ nhất là, đóng gói các mặt hàng vào ~ 1,22 lần số thùng mà một chiến lược tối ưu sẽ có. Vì vậy, chiến lược này có thể đóng gói các mục thành 5 thùng thay vì 4. Tôi nghi ngờ rằng hiệu suất của nó có thể rất gần với tối ưu ngoại trừ các kích thước mục 'bệnh lý' cụ thể.

Bài báo Wikipedia tương tự cũng nói rằng có một "thuật toán chính xác" . Tôi có thể quyết định thực hiện điều đó quá. Tôi sẽ phải đọc bài viết mô tả thuật toán trước.


0

Tôi nghĩ bạn có thể sử dụng bất kỳ công cụ nén nào cho phép chia nhỏ kho lưu trữ


1
Nén không phải là những gì tôi đang tìm kiếm. Điều đó làm cho nó quá cồng kềnh để truy cập các tập tin.
Alex R

0

Bạn có thể lấy một trong các biến thể của chương trình trong hướng dẫn của Hitchhiker cho Haskell , có lẽ sau khi thực hiện một số phần của hướng dẫn đó; hướng dẫn được viết xung quanh việc giải quyết chính xác vấn đề của bạn về việc phân phối mọi thứ vào một số đĩa, theo đó giải pháp được cải tiến dần dần, như được minh họa bằng đoạn văn sau từ Chương 3 của hướng dẫn:

Đủ sơ bộ rồi. Hãy đi gói một số đĩa CD.

Như bạn có thể đã nhận ra, vấn đề của chúng tôi là một vấn đề cổ điển. Nó được gọi là "vấn đề về chiếc ba lô" ( google nó lên , nếu bạn chưa biết nó là gì. Có hơn 100000 liên kết).

hãy bắt đầu từ giải pháp tham lam ...

Thêm ý tưởng: một câu hỏi liên quan

Đây là một câu hỏi tương tự (mặc dù không giống nhau: nó không được yêu cầu tối ưu hóa ở đó), nơi bạn có thể tìm thấy các giải pháp / chương trình hữu ích hơn cho nhiệm vụ của mình (nếu chúng sẽ được đăng):

  • /unix//q/10158/4319 - "Chia cây thư mục lớn thành các khối có kích thước được chỉ định?"

Một số gợi ý để hiểu chương trình trong hướng dẫn được đề xuất

Nói chung, mã Haskell khá biểu cảm (vì Haskell là ngôn ngữ để lập trình ở mức độ trừu tượng cao), và do đó có thể dễ dàng nắm bắt.

Khi xem mã của một trong các giải pháp, hãy nhớ rằng cấu trúc cấp cao nhất của chương trình chúng tôi muốn viết khá đơn giản, như được đưa vào Chương 1 của hướng dẫn:

Bây giờ chúng ta hãy suy nghĩ một chút về cách chương trình của chúng tôi sẽ vận hành và thể hiện nó bằng mã giả:

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

Nghe có vẻ hợp lý? Tôi cũng nghĩ vậy

Chúng ta hãy đơn giản hóa cuộc sống của mình một chút và giả sử bây giờ chúng ta sẽ tính kích thước thư mục ở đâu đó bên ngoài chương trình của chúng ta (ví dụ: với " du -sb *") và đọc thông tin này từ stdin.

và xem xét kỹ hơn các phần của giải pháp.



0

Ngoài ra, hãy thử Discfit, chọn tệp và thư mục để sao chép trên nhiều đĩa khác nhau:

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


Một câu trả lời chỉ với liên kết không phải là một câu trả lời tốt. Khi đề xuất phần mềm, xin vui lòng làm theo phác thảo này . Bạn nên mở rộng ( chỉnh sửa ) câu trả lời của mình để làm cho nó tốt hơn. Ví dụ: câu trả lời của bạn không tuân thủ "yêu cầu tổng quan ngắn gọn về CÁCH sử dụng sản phẩm".
Kamil Maciorowski

Từ trang web: "Sắp xếp một tập hợp lớn các tệp hoặc thư mục để sử dụng số lượng phương tiện phisycal tối thiểu (CD, DVD, BD ...). Bạn có thể kéo các tập kết quả trực tiếp qua phần mềm ghi đĩa của mình (Nero, DVD -đi...)".
Anton

Hầu hết. Để làm cho câu trả lời tốt hơn, bạn nên chỉnh sửa câu trả lời.
Kamil Maciorowski

Tôi không thể thấy bất cứ điều gì nhiều hơn để thêm ngoài những gì các tác giả đã viết. Một người có lẽ chỉ cần vào trang web và hỏi thăm.
Anton

Vậy là được rồi. Quan điểm của tôi là bạn nên chỉnh sửa câu trả lời của mình, không viết bình luận với "mở rộng" cho nó. Đó là câu trả lời nên theo đề cương đã nói, không trả lời + bình luận. Đoạn trích dẫn trong bình luận nên được trích dẫn trong câu trả lời của bạn. Đó là tất cả.
Kamil Maciorowski
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.