【问题标题】:How to write to a binary file using the fastest way possible for Linux?如何使用 Linux 可能的最快方式写入二进制文件?
【发布时间】:2018-08-10 20:54:09
【问题描述】:

我正在开发一个 C 项目,我们必须在嵌入式 Linux 环境 (2.6.37) 中编写一些二进制文件。通常我们能够在 200-300 毫秒内写入文件,但最终文件需要 10 秒才能写入,我们不知道为什么 - 发生是非常随机的,在其他部分没有发生特殊事件系统,例如在 UI 应用中。

无论我们正在修改或写入文件的方法并在网络上进行一些研究(hereherehere),我们得出的结论是使用本机 Linux 代码编写会比纯编写更好C 即使最终可能对我们的问题没有多大帮助。目前我们正在以一种类似的方式编写,即使用这些函数

#include <stdio.h>
const unsigned long long size = 8ULL*1024ULL*1024ULL;
unsigned long long a[size];

int main()
{
    FILE* pFile;
    pFile = fopen("file.binary", "wb");
    for (unsigned long long j = 0; j < 1024; ++j){
        //Some calculations to fill a[]
        fwrite(a, 1, size*sizeof(unsigned long long), pFile);
    }
    fclose(pFile);
    return 0;
}

我想知道的是 这将是本地 Linux 的方式来执行等效操作(并且以最快的方式)?提到的链接只讲述了复制文件,而不是简单地写给它们,所以我想可能会有更具体的功能需要使用。

感谢任何帮助(以及有关原始问题的任何提示)。

【问题讨论】:

  • 很难说没有细节,但我敢打赌,问题不在于文件写入方法,而是其他问题,因为我无法想象这需要 10 秒。
  • 可以并行写吗?是否有文件锁定?会不会陷入僵局?这种计算不仅仅是计算吗?这个计算需要多长时间?设备是什么?真的是本地文件系统吗?
  • 80 亿个项目,8 字节/项目,8 位/字节 = 512 千兆位。在 0.2 秒内写入 512 Gb 意味着您的写入带宽为 2.5 TB/秒。这速度快得离谱,尤其是对于嵌入式系统。我根本不相信你,除非你正在构建一个嵌入式超级计算机。
  • 这听起来像是“忘记这样做”。或者是 XY 问题。
  • @TobySpeight 我会说这比那更糟。假设您只是将数据写入 DRAM,而 DRAM 具有 64 位总线。 DRAM 必须以 40GHz 运行才能维持 2.5 TB/秒的速率。没有以 40GHz 运行的 DRAM,也没有可以以这种速度写入 DRAM 的处理器。使用当前技术,您需要 1024 位宽的 DRAM 总线来维持 2.5 太比特/秒的数据速率。

标签: c linux file binaryfiles file-writing


【解决方案1】:

听起来您正在写入 SD 卡或微型 SD 卡。并非所有卡片都是平等创建的。从你能找到的最快开始。我推荐 SanDisk Extreme Pro。他们声称每秒最多可以存储 90Mbits。

第二,您的“随机”评论导致 SD 卡可能进行负载平衡。该卡内部实际上有一个小型 cpu,它将根据扇区命中进行存储重新分配。他们这样做是为了延长 SD 卡的使用寿命。

如果您向 sd 卡写入少量数据,它会进入 sd 卡本身的内部内存缓冲区。通常它们的大小为每块 512 字节。有时它们有多个这样的“缓存”块,从而导致更高的吞吐量。这为小文件提供了出色的性能。另外,请注意 512。如果您可以将写入匹配为 512 的块,那么您将匹配传输到底层介质的最快方式。 IE。永远不要写小于那个大小;-)

【讨论】:

    猜你喜欢
    • 2011-01-03
    • 2013-05-07
    • 2012-05-01
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-21
    相关资源
    最近更新 更多