2009-12-07 24 views
65

Giả sử tôi đang viết một vài tệp vào đĩa, từ 2MB đến 5GB. Giá trị bộ đệm hợp lý cho FileStream là gì?C# FileStream: Kích thước bộ đệm tối ưu để ghi các tệp lớn?

Có hợp lý để làm việc với bộ đệm của vài megabyte hay tôi nên dính vào bộ đệm kilobyte?

+1

Tại sao không để .Net xử lý bộ đệm và chỉ viết khi bạn cần? – cjk

+1

Chỉ cần thử. Viết một điểm chuẩn nhỏ bằng cách sử dụng StopWatch và cho chúng tôi biết kết quả. –

+4

Tôi nghi ngờ "bộ đệm" được đề cập là bộ đệm bạn phải khai báo khi bạn đang sử dụng sao chép từ một luồng này sang luồng khác (nghĩa là số byte bạn 'Đọc' và sau đó là' Viết' trên một lần lặp). –

Trả lời

43

Kích thước bộ đệm mặc định là 4 KiB.

Ngoài ra, hãy xem ở đây: Sequential File Programming Patterns and Performance with .NET

+2

http://msdn.microsoft.com/en-us/library/dd783870.aspx Kích thước mặc định là '4096' byte – VMAtm

+3

Chỉ cần biên dịch System.IO.FileStream. internal const int DefaultBufferSize = 4096; – Vladimirs

+2

@VMAtm - tham chiếu đó không có thật (về mặt trả lời câu hỏi về lớp FileStream thường sử dụng nội bộ). Kích thước bộ đệm CopyTo lớn hơn đáng kể, 80 KiB, chính xác. Tôi đã viết một số đặc tính hiệu năng của tệp IO của .NET tại đây (http://stackoverflow.com/questions/1540658/net-asynchronous-stream-read-write/19692949#19692949) –

30

Một benchmark chút nhanh chóng dựa trên các tài liệu chương trình tham chiếu không tăng hiệu suất trên hệ thống của tôi lớn hơn kích thước bộ đệm 128KB. Số dặm của bạn có thể thay đổi, vui lòng sử dụng bên dưới.

 Stopwatch sw = new Stopwatch(); 
     Random rand = new Random(); // seed a random number generator 
     int numberOfBytes = 2 << 22; //8,192KB File 
     byte nextByte; 
     for (int i = 1; i <= 28; i++) //Limited loop to 28 to prevent out of memory 
     { 
      sw.Start(); 
      using (FileStream fs = new FileStream(
       String.Format(@"C:\TEMP\TEST{0}.DAT", i), // name of file 
       FileMode.Create, // create or overwrite existing file 
       FileAccess.Write, // write-only access 
       FileShare.None,  // no sharing 
       2 << i,    // block transfer of i=18 -> size = 256 KB 
       FileOptions.None)) 
      { 
       for (int j = 0; j < numberOfBytes; j++) 
       { 
        nextByte = (byte)(rand.Next() % 256); // generate a random byte 
        fs.WriteByte(nextByte);    // write it 
       } 
      } 
      sw.Stop(); 
      Console.WriteLine(String.Format("Buffer is 2 << {0} Elapsed: {1}", i, sw.Elapsed)); 
      sw.Reset(); 
     } 
+2

+1 cho điểm chuẩn mã nhưng OP đã yêu cầu viết kích thước bộ đệm. Cách tiếp cận là âm thanh, tuy nhiên. –

+1

Hm, bình luận của bạn mâu thuẫn với chính nó. Bạn nói 'size = 256 KB', nhưng đồng thời bạn yêu cầu' i = 18', và '2 << 18' thực ra là 512 KB. – Timwi

+0

2 << 18 == 262144 byte 1024 byte trong một byte kilo, do đó 256 KB. Tôi đang thiếu gì? – Firestrand

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