c - 如何使用 Linux 最快的方式写入二进制文件?

标签 c linux file binaryfiles file-writing

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

无论是修改方式还是写入文件的方法以及在网络上进行一些研究(hereherehere),我们得出的结论是使用 native 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;
}

嗯,我想知道的是执行等效操作的 native Linux 方式(并且以最快的方式)?提到的链接只说明复制文件,而不是简单地写入文件,所以我想可能会有更具体的功能要使用。

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

最佳答案

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

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

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

关于c - 如何使用 Linux 最快的方式写入二进制文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32766685/

相关文章:

c - IP header 版本 5?

c - 循环到文件末尾时?

python - 平台/版本无关的方法,仅使用标准库查找我的 Linux 机器中所有接口(interface)的 IP 地址

c++ - 如何从开放管道读取数据: example needed

Cocoa API 设置文件打开的默认应用程序

c - C中的变量名是如何存储在内存中的?

c - 在 C 中处理管道

c++ - QFileInfo 所有者和组为空

C# 将文件从一个目录移动到 Azure 文件共享上的另一个目录

c++ - MSVC 的 _M_X64 预定义宏说明