【问题标题】:Fastest way to write to a pipe写入管道的最快方法
【发布时间】:2012-11-15 08:50:20
【问题描述】:

我编写了这个程序,其中一个线程获取 char* 缓冲区并将它们写入管道 创建如下:

 ret_val = mkfifo(lpipename.c_str(), 0666);
 pipehandler = open(lpipename.c_str(), O_RDWR);

然后我一个接一个地写入管道,如下所示:

 int size = string(pcstr->buff).length()
 numWritten = write(pipehandler, pcstr->buff, size);

每个 pcstr->buff 是一个指向预先配置大小为 1-5 MB 的 malloc 大小的指针

但是,写入 pipe 比填充 pcstr->buff (来自另一个来源)花费的时间太长,并且它使我的程序运行太慢。

有人知道更快的写作方法吗?

谢谢

【问题讨论】:

  • 是否有理由不知道pcstr->buff 的大小(因此创建一个字符串只是为了计算它)?
  • @R.MartinhoFernandes 是的...大小是从配置文件中接收的
  • 但是你说的是第三个参数吗?
  • 为什么不保存那个大小而不是一次又一次地计算它?
  • Write() 可能会阻塞,因为您的数据对于内核的管道缓冲区来说太大了,因此它必须等待读取过程将其耗尽。您可能需要将流设置为非阻塞模式,并缓冲数据,以便在可用空间时写入。

标签: c++ linux pipe fifo


【解决方案1】:

每个 pcstr->buff 是一个指向预先配置大小为 1-5 MB 的 malloc 大小的指针

只需将长度保存在某处即可。将它复制到std::string 只是为了找出它的大小是相当浪费的。或使用strlen()

但是,写入 pipe 比填充 pcstr->buff(来自另一个来源)要花费更长的时间,并且这会使我的程序运行太慢。

In Linux the default maximum pipe buffer size is 1Mb as of today。您提到您在管道中写入了超过 1Mb 的数据。当这种情况发生时,写入线程会阻塞,直到管道中的一些数据被消耗完。

有人知道更快的写作方法吗?

/dev/shm/tmp 中使用纯文件。在最新的 Linux 上,/tmp 是一个内存文件系统。但这仅适用于通过管道发送的数据量可以保存在文件中而不会溢出可用磁盘空间或内存量的情况。

【讨论】:

  • 我没有完全了解关于长度的第一部分......我确实提前知道了长度......这是我分配给 malloc 的参数 :-) 所以它是已修复...不过,我将检查第二部分的最大文件大小...听起来很有趣。谢谢:-)
  • @user1432779: string(pcstr->buff).length() - 这会复制缓冲区,返回字符串长度,然后销毁副本。请改用strlen(pcstr->buff)
  • 首先我知道大小是多少,因为我调用了 pcstr->buff = malloc(THE SIZE) :-) 所以我现在使用 THE SIZE 而不是 strlen 或 length()。 .thanks but..我将 THE SIZE 更改为 1MB,但它仍然没有像我预期的那样快速写入缓冲区:-(
  • @user1432779:在较旧的 Linux 内核上,管道缓冲区大小为 64Kb,如果内存对我有用的话。正如我所说,使用文件。
  • @Maxim,它在您发送的手册页中说可以在 /proc/sys/ 中更改最大管道大小...真的适用吗?
猜你喜欢
  • 1970-01-01
  • 2012-10-17
  • 2014-06-23
  • 1970-01-01
  • 1970-01-01
  • 2014-03-23
  • 1970-01-01
  • 2012-06-01
  • 2013-02-28
相关资源
最近更新 更多