将数据写入文件:fflush()需要大量时间

2024-04-19

我有一个要求,其中我必须缓冲大量数据(以 GB 为单位)以供将来使用。 由于没有足够的 RAM 来缓冲如此大量的数据,我决定将数据存储在文件中。

现在的陷阱是,当我将数据写入文件时,其他线程可能需要“缓冲”数据,因此每次向文件流写入内容时,我都必须刷新文件流。准确地说,数据是我缓冲为预先录制的数据的视频帧(如 TiVo) 其他线程可能想也可能不想在任何给定的时间点写入它,但是当它们这样做时,它们fread从文件中并处理帧。

在一般情况下,fwrite-fflush连击大约需要 150 秒,但偶尔(并且相当经常),连击需要超过 1.5 秒。我负担不起,因为我必须实时处理帧。

我在这里有很多问题:

  1. 我在文件中缓冲数据的方法是否正确?我还有哪些选择?

  2. 知道为什么 fwrite-fflush 操作在某些情况下突然需要更多时间吗?请注意,一次花费 1.5 秒后,它会恢复到 150 us。


至于#2:大多数现代文件系统使用 btree 方法来管理当今巨大硬盘中的目录和数据节点数量。与所有 B 树一样,它们有时需要平衡。当这种情况发生时,不得进行任何更改,这就是系统锁定的原因。通常,这不是什么大问题,因为操作系统有巨大的缓存,但你是一个会受到伤害的极端情况。

你能为这个做什么?有两种方法:

  1. 使用套接字进行通信并将最后 N 帧保留在 RAM 中(即永远不要将它们写入磁盘或使用独立进程将其写入磁盘)。

  2. 不要写入新文件,覆盖现有文件。由于所有数据块的位置都是预先知道的,因此在写入时 FS 中不会进行重组。它也会快一点。因此,我们的想法是创建一个大文件或使用原始分区,然后覆盖它。当您到达文件末尾时,返回到开头并重复。

缺点:

使用方法#1,您可能会丢失帧。此外,您必须绝对确保所有客户端都可以足够快地读取和处理数据,否则服务器可能会阻塞。

对于#2,您必须找到一种方法来告诉读者当前的“文件结尾”在哪里。

所以也许混合方法是最好的:

  1. 创建一个巨大的文件(几 GB)。如果一个文件不够,请创建多个。
  2. 打开一个套接字
  3. 将数据写入文件。如果到达文件末尾,则寻找位置 0 并继续在那里写入(就像循环缓冲区一样)。
  4. 刷新数据
  5. 通过套接字将新数据的开始和数量发送给阅读器

考虑使用内存映射文件;这将使一切变得更加简单。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将数据写入文件:fflush()需要大量时间 的相关文章

  • 如何以编程方式将访问键(快捷方式)添加到 WPF ContextMenu?

    我已经有以下内容 var myContextMenu new System Windows Controls ContextMenu var exitItem new MenuItem exitItem Header E xit exitI
  • 如何在C++中生成非常大的随机数

    我想使用 C 生成 0 2 64 范围内的非常大的随机数 我已经使用了 rand 函数 但它没有生成非常大的数字 有人可以帮忙吗 使用c 11 使用标准c 11的随机库 http en cppreference com w cpp nume
  • strtok() 使用安全吗[重复]

    这个问题在这里已经有答案了 我读到了很多负面的东西strtok 有人说它已经过时 有人说它不是线程安全的 等等 那么真相是什么 我可以使用吗strtok 它是线程安全的吗 Note 我正在使用 Visual C 您可以使用它 它是标准库的一
  • 信号与信号2

    我的应用程序可能会受益于使用 boost 的信号库之一而不是本土解决方案 该应用程序是多线程的 但执行信号处理的部分是单线程的 如果多线程不是问题 是否有任何理由更喜欢 Boost Signals2 而不是 Boost Signal Boo
  • 如何使用c#从数据桶中获取所有文档?

    如何获取数据桶中的所有文档 我尝试过一个示例 但我只能获得一个特定的文档 这是我的代码 CouchbaseClient oclient oclient new CouchbaseClient vwspace data bucket name
  • 从内存流播放视频文件

    只是好奇看看这是否可能 我有一个 Windows 应用程序 它从我的电脑上的 avi 文件读取所有字节 然后将其存储在 byte 中 现在我的内存中有 avi 文件 我想直接从内存将其加载到某种视频播放器控件中 我尝试过使用 wmplaye
  • 为什么 BinaryFormatter 可以序列化 Action<> 但 Json.net 不能

    尝试序列化 反序列化 Action 尝试我的 1天真 JsonConvert SerializeObject myAction JsonConvert Deserialize
  • 如何调试.NET Windows Service OnStart方法?

    我用 NET 编写的代码仅在作为 Windows 服务安装时才会失败 该故障甚至不允许服务启动 我不知道如何进入 OnStart 方法 如何 调试 Windows 服务应用程序 http msdn microsoft com en us l
  • 使用 OleDbCommand / OleDbDataAdapter 读取 CSV 文件

    我不明白为什么 但是当我使用 OleDbDataAdapter 或 OleDbCommand 读取 CSV 文件时 在这两种情况下 生成的数据结构良好 它识别文件头中的列 但行数据都是空字符串 我之前已经成功进行过多次 CSV 处理 因此我
  • 冒号在c中起什么作用?

    我在课堂上得到了这个例子 但我不确定它的作用 我知道冒号添加了一个位字段 但我仍然不确定这个问题 a b gt 0 3 1 运算符称为条件运算符 If b值为 gt 0 价值3被分配给a否则值1被分配给a 以 Kernighan Ritch
  • 如果finally 块包含await,为什么*有时*不会在ThreadAbortException 上执行?

    UPDATE 我不认为这个问题是重复的ThreadAbortException最后可以跳过吗 https stackoverflow com questions 18002668 can threadabortexception skip
  • 从 C# 调用时无法识别 Powershell 命令

    这是这个的延续Question https stackoverflow com questions 66280000 powershell object returns null 66280138 noredirect 1 comment1
  • 使用 cmake 将两种解决方案合二为一

    我有两个单独的 Visual Studio 2013 解决方案 我想将它们迁移到一个解决方案中 因为第一个解决方案 使用 Qt 充当第二个解决方案的 GUI 最后 我希望有一个结构如下的单一解决方案 Solution All Build P
  • 意外的 const 引用行为

    include
  • 实体框架读取列但阻止其更新

    给定一个数据库表 其中有一列包含历史数据但不再填充 实体框架中是否有一种方法可以读取该列 但在使用相同的模型对象时防止它被更新 例如我有一个对象 public class MyObject public string CurrentData
  • 如果仅使用第一个元素,是否必须为整个结构分配内存?

    我有一个结构 其中第一个元素被测试 并且根据其值 结构的其余部分将被读取或不会被读取 在第一个元素的值指示结构的其余部分不会被读取的情况下 我是否必须为整个结构或仅第一个元素分配足够的内存 struct element int x int
  • Unity - 在生成时获取随机颜色

    我有一个小问题 我想在我的场景中生成四边形 它们都应该有红色或绿色作为材质 但 Random Range 函数只能是 int 我该如何解决它 void SpawningSquadsRnd rndColor 0 Color red rndCo
  • C# PasswordDeriveBytes:似乎 Salt 并不重要

    可能我误解了什么 以下代码通过 CryptDeriveKey 使用两种不同的盐生成两个相等的密钥 这是控制台结果 盐1 21 3e 18 a3 9a 8b 5f gt 键 da 89 ea 3d 91 08 20 98 20 e9 dc 4
  • 强制函数调用的顺序?

    假设我有一个抽象基类 并且我想要一个必须由派生类实现的纯虚方法 但我想确保派生方法以特定顺序调用函数 我可以做什么来强制执行它 I E base class virtual void doABC 0 virtual void A 0 vir
  • 在 C# 中使用自定义千位分隔符

    在显示字符串时 我尝试不使用 字符作为千位分隔符 而是使用空格 我想我需要定义一种自定义文化 但我似乎做得不对 有什么指点吗 例如 将 1000000 显示为 1 000 000 而不是 1 000 000 no String Replac

随机推荐