C 长字符串数据的临时存储
我正在寻找一种合适的方法,使用posix系统上的标准库,使用C程序临时存储一个可能非常大的字符串。字符串是C函数行输出的顶点。在最后一次调用这个函数之后,我想进一步处理(输出)数据。在分配大量内存和创建临时文件之间是否存在简单的折衷?例如,我可以想象在需要数据时,向管道写入数据,然后再次从该管道读取数据。但我不确定在这种情况下,数据在内部会如何处理,是否会优先于临时文件。这主要取决于您需要如何处理数据。如果您需要随机访问它(例如,如果您需要对其进行排序),您可能会发现,如果文件都在内存中,那么访问会容易得多,尽管使用大量内存可能会带来成本 特别是,如果您能够按顺序访问数据以进行处理,我通常建议您使用一个临时文件(如果您希望数据很大)C 长字符串数据的临时存储,c,linux,pipe,std,C,Linux,Pipe,Std,我正在寻找一种合适的方法,使用posix系统上的标准库,使用C程序临时存储一个可能非常大的字符串。字符串是C函数行输出的顶点。在最后一次调用这个函数之后,我想进一步处理(输出)数据。在分配大量内存和创建临时文件之间是否存在简单的折衷?例如,我可以想象在需要数据时,向管道写入数据,然后再次从该管道读取数据。但我不确定在这种情况下,数据在内部会如何处理,是否会优先于临时文件。这主要取决于您需要如何处理数据。如果您需要随机访问它(例如,如果您需要对其进行排序),您可能会发现,如果文件都在内存中,那么访
除非在主线程写入数据时创建另一个线程从管道中读取数据,否则管道不会对您有所帮助。否则,您只需快速填充管道的缓冲区和块(实际上是死锁)。这主要取决于您需要对数据做什么。如果您需要随机访问它(例如,如果您需要对其进行排序),您可能会发现,如果文件都在内存中,那么访问会容易得多,尽管使用大量内存可能会带来成本 特别是,如果您能够按顺序访问数据以进行处理,我通常建议您使用一个临时文件(如果您希望数据很大) 除非在主线程写入数据时创建另一个线程从管道中读取数据,否则管道不会对您有所帮助。否则,您只需快速填充管道的缓冲区和块(实际上是死锁)。您可以决定(根据您的评论,您应该根据具体情况决定)是将其保存在内存中还是写入磁盘。如果您注意到数据增长超过了某个阈值,您将写入磁盘并切换剩余数据的放置方法 管道不是一个好主意,因为它是一种进程间通信方法,存储容量非常小(从Linux 2.6开始,在2.4中大约是64kiB,甚至更少-4kib左右)。您可以决定(根据您的评论,您应该根据具体情况决定)是将其保存在内存中还是写入磁盘。如果您注意到数据增长超过了某个阈值,您将写入磁盘并切换剩余数据的放置方法
管道不是一个好主意,因为它是一种进程间通信方法,存储容量非常小(从Linux 2.6开始,大约64KB,在2.4中,甚至更少-4KB左右)。数据可以是长数据也可以是短数据。大多数情况下,它只是一行,但在最坏的情况下,它甚至可能超过可用的物理内存。我不需要随机访问数据,但每次需要输出数据时,创建close-open并读取临时文件似乎会增加开销,而且速度较慢。请注意,我不需要在数据仍然生成时访问它。因此,我可以写入管道,关闭它,再次打开它并读取,但我不确定在这种情况下管道中的数据会发生什么变化。我认为它是持久的,直到阅读。但是它存储在临时文件中吗?如果通常的情况是数据很短,但有时很长,那么您可以在内存中缓冲它,直到它超过某个大小阈值,然后将其移动到临时文件中。这对您来说是更多的工作,因为您必须在代码中处理这两种情况。根据您的需要,接受开销并始终使用临时文件可能更简单。您的管道建议毫无意义。打开管道,关闭它,然后再次打开它,对于一个普通的管道(你需要一个命名的管道)是不可能的,即使你这样做了,也没有任何帮助。如果没有读卡器,写入程序在(相对较小的)缓冲区满后仍会阻塞。是的,我刚才说的是命名管道。但从GLGL的回答中,我了解到缓冲区太小。数据可以是长的,也可以是短的。大多数情况下,它只是一行,但在最坏的情况下,它甚至可能超过可用的物理内存。我不需要随机访问数据,但每次需要输出数据时,创建close-open并读取临时文件似乎会增加开销,而且速度较慢。请注意,我不需要在数据仍然生成时访问它。因此,我可以写入管道,关闭它,再次打开它并读取,但我不确定在这种情况下管道中的数据会发生什么变化。我认为它是持久的,直到阅读。但是它存储在临时文件中吗?如果通常的情况是数据很短,但有时很长,那么您可以在内存中缓冲它,直到它超过某个大小阈值,然后将其移动到临时文件中。这对您来说是更多的工作,因为您必须在代码中处理这两种情况。根据您的需要,接受开销并始终使用临时文件可能更简单。您的管道建议毫无意义。打开管道,关闭它,然后再次打开它,对于一个普通的管道(你需要一个命名的管道)是不可能的,即使你这样做了,也没有任何帮助。如果没有读卡器,写入程序在(相对较小的)缓冲区满后仍会阻塞。是的,我刚才说的是命名管道。但从GLGL的回答中,我明白缓冲区太小了。当然!然而,在我看来,似乎应该有一个标准的方法来做到这一点。当然!然而,在我看来,似乎应该有一个标准的方法来做到这一点。