Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 长字符串数据的临时存储_C_Linux_Pipe_Std - Fatal编程技术网

C 长字符串数据的临时存储

C 长字符串数据的临时存储,c,linux,pipe,std,C,Linux,Pipe,Std,我正在寻找一种合适的方法,使用posix系统上的标准库,使用C程序临时存储一个可能非常大的字符串。字符串是C函数行输出的顶点。在最后一次调用这个函数之后,我想进一步处理(输出)数据。在分配大量内存和创建临时文件之间是否存在简单的折衷?例如,我可以想象在需要数据时,向管道写入数据,然后再次从该管道读取数据。但我不确定在这种情况下,数据在内部会如何处理,是否会优先于临时文件。这主要取决于您需要如何处理数据。如果您需要随机访问它(例如,如果您需要对其进行排序),您可能会发现,如果文件都在内存中,那么访

我正在寻找一种合适的方法,使用posix系统上的标准库,使用C程序临时存储一个可能非常大的字符串。字符串是C函数行输出的顶点。在最后一次调用这个函数之后,我想进一步处理(输出)数据。在分配大量内存和创建临时文件之间是否存在简单的折衷?例如,我可以想象在需要数据时,向管道写入数据,然后再次从该管道读取数据。但我不确定在这种情况下,数据在内部会如何处理,是否会优先于临时文件。

这主要取决于您需要如何处理数据。如果您需要随机访问它(例如,如果您需要对其进行排序),您可能会发现,如果文件都在内存中,那么访问会容易得多,尽管使用大量内存可能会带来成本

特别是,如果您能够按顺序访问数据以进行处理,我通常建议您使用一个临时文件(如果您希望数据很大)


除非在主线程写入数据时创建另一个线程从管道中读取数据,否则管道不会对您有所帮助。否则,您只需快速填充管道的缓冲区和块(实际上是死锁)。

这主要取决于您需要对数据做什么。如果您需要随机访问它(例如,如果您需要对其进行排序),您可能会发现,如果文件都在内存中,那么访问会容易得多,尽管使用大量内存可能会带来成本

特别是,如果您能够按顺序访问数据以进行处理,我通常建议您使用一个临时文件(如果您希望数据很大)

除非在主线程写入数据时创建另一个线程从管道中读取数据,否则管道不会对您有所帮助。否则,您只需快速填充管道的缓冲区和块(实际上是死锁)。

您可以决定(根据您的评论,您应该根据具体情况决定)是将其保存在内存中还是写入磁盘。如果您注意到数据增长超过了某个阈值,您将写入磁盘并切换剩余数据的放置方法

管道不是一个好主意,因为它是一种进程间通信方法,存储容量非常小(从Linux 2.6开始,在2.4中大约是64kiB,甚至更少-4kib左右)。

您可以决定(根据您的评论,您应该根据具体情况决定)是将其保存在内存中还是写入磁盘。如果您注意到数据增长超过了某个阈值,您将写入磁盘并切换剩余数据的放置方法


管道不是一个好主意,因为它是一种进程间通信方法,存储容量非常小(从Linux 2.6开始,大约64KB,在2.4中,甚至更少-4KB左右)。

数据可以是长数据也可以是短数据。大多数情况下,它只是一行,但在最坏的情况下,它甚至可能超过可用的物理内存。我不需要随机访问数据,但每次需要输出数据时,创建close-open并读取临时文件似乎会增加开销,而且速度较慢。请注意,我不需要在数据仍然生成时访问它。因此,我可以写入管道,关闭它,再次打开它并读取,但我不确定在这种情况下管道中的数据会发生什么变化。我认为它是持久的,直到阅读。但是它存储在临时文件中吗?如果通常的情况是数据很短,但有时很长,那么您可以在内存中缓冲它,直到它超过某个大小阈值,然后将其移动到临时文件中。这对您来说是更多的工作,因为您必须在代码中处理这两种情况。根据您的需要,接受开销并始终使用临时文件可能更简单。您的管道建议毫无意义。打开管道,关闭它,然后再次打开它,对于一个普通的管道(你需要一个命名的管道)是不可能的,即使你这样做了,也没有任何帮助。如果没有读卡器,写入程序在(相对较小的)缓冲区满后仍会阻塞。是的,我刚才说的是命名管道。但从GLGL的回答中,我了解到缓冲区太小。数据可以是长的,也可以是短的。大多数情况下,它只是一行,但在最坏的情况下,它甚至可能超过可用的物理内存。我不需要随机访问数据,但每次需要输出数据时,创建close-open并读取临时文件似乎会增加开销,而且速度较慢。请注意,我不需要在数据仍然生成时访问它。因此,我可以写入管道,关闭它,再次打开它并读取,但我不确定在这种情况下管道中的数据会发生什么变化。我认为它是持久的,直到阅读。但是它存储在临时文件中吗?如果通常的情况是数据很短,但有时很长,那么您可以在内存中缓冲它,直到它超过某个大小阈值,然后将其移动到临时文件中。这对您来说是更多的工作,因为您必须在代码中处理这两种情况。根据您的需要,接受开销并始终使用临时文件可能更简单。您的管道建议毫无意义。打开管道,关闭它,然后再次打开它,对于一个普通的管道(你需要一个命名的管道)是不可能的,即使你这样做了,也没有任何帮助。如果没有读卡器,写入程序在(相对较小的)缓冲区满后仍会阻塞。是的,我刚才说的是命名管道。但从GLGL的回答中,我明白缓冲区太小了。当然!然而,在我看来,似乎应该有一个标准的方法来做到这一点。当然!然而,在我看来,似乎应该有一个标准的方法来做到这一点。