C# - 文件大小对写入速度有影响吗?

C# - Is the size of a file have an influence on the write speed?

我有一个日志文件,它以 (10MB/小时) 的节奏记录日志,这个程序需要 运行 在接下来的 10 多年里。我需要决定创建新日志文件的大小!

我将写入 10KB 文件的时间与写入 1GB+ 文件的时间进行了比较,时间几乎相同。

文件大小对写入速度有影响吗, 是否建议将日志文件的大小保持得非常小?

我的 C# 日志函数:

//LOGGING FUNCTION
public static void Log(string LogInfo)
{
    //FILE SIZE LIMITATION 50 000 000 Bytes, 50MB
    MaximumFileSize = 50000000
    long FileSize = 0;

    if (File.Exists("../Log/EventLog.txt"))
    {
        FileSize = new System.IO.FileInfo("../Log/EventLog.txt").Length;
    }
    if (File.Exists("../Log/EventLog.txt") && (FileSize > MaximumFileSize)) NewLog();

    if (!System.IO.Directory.Exists("../Log/")) System.IO.Directory.CreateDirectory("../Log/");

    using (StreamWriter s = File.AppendText("../Log/EventLog.txt"))
    {
        s.WriteLine(DateTime.Now.ToString() + " -- " + LofInfo);
        s.Close();
    }
}

//FUNCTION TO ARCHIVE LOG
public static void NewLog()
{

    if (File.Exists("../Log/EventLog.txt"))
    {
        File.Move("../Log/EventLog.txt", "../Log/EventLog_" + DateTime.Now.ToString("yyyyMMdd_HH_mm_ss") + ".txt");
    }

}

我们有一个记录小二进制文件(几 KB)的应用程序。我们每天写入的数据量大约是原来的 10 倍,尽管文件非常小,但即使是 2000 年的旧笔记本电脑硬盘也能够毫无问题地跟上。这可能回答了您的主要问题。

但是:当我们移动这些文件的 GB 时,传输速度非常慢。 SSD 相对优于 HDD,但仍然非常慢(低于 1MB/s)。

在碎片化的 HDD 上,小文件可能适合整个磁盘的小可用磁盘空间,而大文件更有可能放在一个大块中。由于 HDD 每次不读取顺序数据流时可能会旋转一圈,因此传输速度将受到影响。

每个文件的最佳大小可能因磁盘而异,但是当您需要复制一年的日志时,每天或每周的日志文件 (10-70 MB) 似乎是在发送文件的方便性和传输速度之间的一个很好的权衡文件。

还要考虑您将如何使用这些日志文件。它们通常在记事本或类似工具中打开,随着文件变大,这会花费更多时间。祝你好运地打开一个 1GB 的文件。我会坚持更多,比如每个文件 10 兆字节(即使这样也不会立即打开)。如果需要,想出一个排序的文件名命名逻辑来使文件易于相互关联是微不足道的。

更好的是,随着日期的变化创建新的日志文件(并在文件名中加入 yyyy-mm-dd 格式以便更好地排序)。为了进行比较,请查看 IIS 日志记录提供的与旋转日志文件相关的选项。毕竟,确定 current 日志条目需要转到哪个日志文件要容易得多(如果 daily/hourly 模式,文件名将是确定性的)然后它将是确定 current 日志文件的当前 size(也可以考虑多个 threads/app-instances 的同时访问)。换句话说,使用 current-system-time 来确定目标日志文件要容易得多。如果您预计会有冗长的日志,则每小时进行一次;否则每日计划可能就足够了。它们将有各种大小,但这也许没关系(即使你使用固定大小,你也无法实现精确的字节等效)。

否则,您将不得不编写代码来读取这些相同的文件,在这种情况下,这就引出了一个问题:为什么不使用数据库来存储该日志信息,因为它更容易用于呈现在一些未来的观众。