c++ - 写入超过内核允许一次打开的文件的最佳方法是什么?

标签 c++ c performance fopen fwrite

我有一个非常大的二进制文件,我需要根据输入文件中的 ID 创建单独的文件。有 146 个输出文件,我正在使用 cstdlibfopenfwriteFOPEN_MAX 是 20,所以我不能同时打开所有 146 个输出文件。我还想尽量减少打开和关闭输出文件的次数。

如何有效地写入输出文件?

由于遗留代码,我还必须使用 cstdlib 库。

可执行文件还必须与 UNIX 和 Windows 跨平台兼容。

最佳答案

您可能会采取的几种可能的方法:

  • 保留打开的输出文件句柄的缓存,该句柄小于 FOPEN_MAX - 如果需要对已打开的文件进行写入,则只执行写入操作。否则,关闭缓存中的句柄之一并打开输出文件。如果您的数据通常根据一组特定文件的数据在输入文件中分组在一起,那么这应该可以很好地与文件句柄缓存的 LRU 策略一起使用。

  • 自己处理输出缓冲,而不是让库为您做:保留您自己的 146 个(或您可能需要的数量)输出缓冲区并将输出缓冲到这些缓冲区,然后执行打开/刷新/当一个特定的输出缓冲区被填满时关闭。您甚至可以将其与上述方法结合使用,以真正最大限度地减少打开/关闭操作。

只要确保您对填充或接近填充输出缓冲区时可能发生的边缘条件进行了良好测试即可。

关于c++ - 写入超过内核允许一次打开的文件的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3054892/

相关文章:

c - Mac 上架构 x86_64 错误的 undefined symbol

c++ - cv::imshow 有时很慢

.net - LINQ First 与 Find 性能注意事项

c++ - 在多个线程上发布任务时 boost::asio::thread_pool 线程安全吗?

c++ - 使用 extern 跨文件共享 const 时,为什么在定义中需要 extern?

c - sscanf : skip any number of given chars

c - strtol、strtod 不安全吗?

c++ - 我如何计算包含数字和字母的字符串的平均值?

c++ - 如何解决具有多个派生类的抽象基类的继承

.net - HashSet<T>.Contains 如何比 List<T>.Contains 快?