2010-08-03 78 views
18

Mất khoảng 2 phút để thực hiện File.Copy(src, dest); đối với Tệp 1,6 GB từ Thư mục A đến Thư mục B trên cùng một ổ đĩa. Có cách nào nhanh hơn để làm điều này trong C# /. NET trong mã (w/o phần cứng) - Một cái gì đó với dòng, luồng vv?Có cách nào nhanh hơn để sao chép tệp không phải là File.Copy

Chuỗi video có nhanh hơn không? Làm thế nào về một lớp mà tập hợp các tập tin bằng cách sử dụng một threadpool, và đọc một loạt các byte/viết một loạt các byte [mà âm thanh như một cách tuyệt vời để hỏng tập tin, nhưng tính toàn vẹn không phải là ưu tiên 1 ở đây, tốc độ của nó :-) ]

Tôi đã tìm kiếm nhưng mọi người đều sử dụng File.Copy, nhưng nó chậm (chậm như Windows Copy) - Tôi không muốn sử dụng công cụ của bên thứ 3.


Dưới đây là một số câu trả lời cho một số câu hỏi:

Sao chép thời gian so sánh:

> C# : 2.15m 
> Windows Explorer: 2.53m 
> TeraCopy: 2.26m 
> FastCopy: 2.24m 

Ok, đó là không trung bình và tôi biết rằng họ có thể thay đổi một chút về chạy tiếp theo, nhưng Tôi thực sự nghĩ rằng sẽ có một cách nhanh hơn để sao chép tệp từ khi tôi giả định rằng Windows đang thực hiện kiểm tra bảo mật và tính toàn vẹn bổ sung :-(

Tôi vẫn đang hy vọng câu trả lời hay của tôi (như 'oh yea, tệp trên 1,5 GB sẽ là x nhanh hơn nếu bạn làm đệm m và tắt bảo mật n') - ok, tôi chỉ muốn vào thời điểm này.

+11

Tôi nghĩ bạn sẽ bị ép phải thực hiện sao chép tệp, nhanh hơn cửa sổ, trên hộp cửa sổ. –

+0

Tôi cho rằng ổ đĩa của bạn là một ổ đĩa dựa trên đĩa truyền thống. Nếu vậy, việc chunking các tập tin có thể sẽ làm chậm những thứ xuống do tìm thời gian. – Greg

+0

Sao chép 1.6GB sang vị trí mới trên cùng ổ đĩa * * không phải là hoạt động rất tốt cho ổ đĩa cứng. Nó phải nhảy xung quanh tất cả các nơi để hỗ trợ đọc và viết mô phỏng. –

Trả lời

2

Tôi giả định rằng cửa sổ sao chép, tệp.copy, Copyfile Tất cả sử dụng cùng một cuộc gọi hệ điều hành cơ bản để thực hiện sao chép. Tôi sẽ nghi ngờ rằng bất cứ điều gì bạn viết sẽ tốt hơn các cuộc gọi nội bộ hệ điều hành.

5

Bạn có thể thử sử dụng phần cứng theo ý của mình và phân bổ bộ đệm lớn trong bộ nhớ. Bằng cách đọc và viết bằng các khối lớn hơn, bạn có thể loại bỏ một số chi phí.

Tuy nhiên, không có nhiều chi phí để loại bỏ, cổ chai vẫn là I/O đĩa. Tôi sẽ mong đợi ở một cái gì đó tốt nhất như giảm 5% trong thời gian thực hiện.

7

Nếu bạn quan tâm đến việc tạo biểu tượng hoặc liên kết cứng thay vì bản sao thực tế thì các API Windows sau đây có thể hữu ích.

+7

+1 Cách nhanh nhất để di chuyển núi không phải là di chuyển núi. ;> – dthorpe

+0

SymbolicLink mang lại lợi ích gì, tôi đang cố gắng quấn đầu của tôi và làm mẫu với P/Invoke - nếu tôi thử FileInfo mới ("symbolicFileName.txt"). Tên nó trả về tên, nhưng nếu tôi thử File.Open ("symbolicFileName.txt", .....) nó nói nó không thể tìm thấy tập tin. Thông tin tôi tìm thấy trên SymbolicLink khá là vô ích khi thực sự giải thích nó là gì và nó có thể có ích cho tôi như thế nào. Những gì tôi thực sự muốn là một tập tin để sửa đổi, nếu tất cả tốt của nó, thay thế origional, tôi đã làm điều này với File.Copy cả hai cách. – schmoopy

+2

@schmoopy: Câu trả lời này sẽ không hữu ích cho bạn trong trường hợp đó. Liên kết cứng và liên kết tượng trưng về cơ bản là các con trỏ hệ thống tập tin. Vì vậy, nếu bạn cố gắng sửa đổi một tập tin được mở từ một liên kết cứng thì nó sẽ thay đổi nội dung của tập tin gốc. Cảm thấy tự do để bỏ một downvote về câu trả lời của tôi. Tôi sẽ nhưng bạn không thể downvote mình. Nó vẫn có thể hữu ích để giữ cho câu trả lời nếu không tôi sẽ chỉ xóa nó. –

4

File.Copy hiện một cuộc gọi đến CreateFile trong Kernel32.dll. Nếu bạn đã sao chép rất nhiều và rất nhiều tập tin nhỏ (nghĩ hàng triệu) nó có thể là đáng giá để làm P/Gọi để chơi với các tham số và bỏ qua các yêu cầu quyền. Một tập tin lớn 99,999% trong 2 phút được sử dụng bên trong mã trình điều khiển.

1

Tôi chưa thử điều này, nhưng có thể nhanh.

Thực hiện hai ánh xạ bộ nhớ, một ánh xạ tới tệp đầu vào và một đến đầu ra và di chuyển bộ nhớ từ bộ nhớ này sang bộ lọc khác. Việc ánh xạ trang được thực hiện bởi hệ điều hành được điều chỉnh theo hiệu suất cao nhất có thể, vì nó tác động đến tốc độ hệ thống tổng thể.

0

Tôi nghĩ rằng trước tiên bạn nên kiểm tra xem đĩa của bạn bị phân mảnh bao nhiêu. Nếu tệp của bạn có nhiều phần và bạn không có dung lượng trống liên tục lớn cho đĩa thứ hai thì đĩa phải di chuyển rất nhiều lần và rất chậm.

Có lẽ đĩa của bạn đơn giản và cũ và bạn đạt đến hiệu suất tối đa. Trong trường hợp đó giải pháp đơn giản, bạn cần phải mua một giải pháp mới, hoặc tốt hơn hai và tạo RAID 0.

Bạn cũng có thể kiểm tra xem trong khi sao chép cái gì khác không sử dụng cùng một đĩa, ví dụ như dịch vụ chống vi-rút hoặc lập chỉ mục .

Tôi đã không đề xuất bất kỳ giải pháp phần mềm nào, bởi vì tôi không tin rằng có bất cứ điều gì nhanh hơn các chức năng được cung cấp bởi hệ điều hành.

1

Đối với một tệp, chuyển đến/từ cùng một ổ đĩa, câu trả lời cho câu hỏi của bạn là: no.

Để chuyển mạng, di chuyển tấn tệp và các tình huống phức tạp khác có thể có chỗ để cải thiện.

Nếu yêu cầu hiện tại của bạn là sao chép GB sang vị trí vật lý thứ hai (không cộng hưởng) trên cùng một đĩa, thì cơ hội tốt nhất để cải thiện hiệu suất có thể là đĩa nhanh hơn.

0

Tất cả sẽ phụ thuộc vào phân bổ do HĐH quyết định tại thời điểm sao chép, nếu tệp nằm trong bộ đệm (làm 5x theo cùng một cách để tránh nó).

Kết quả rõ ràng nhất là nếu bạn lặp lại phép thử nhiều lần.

Các vấn đề liên quan