C:使用fprintf编译器导出大型阵列?
在C语言中,我想将一个1D数组(浮点数)导出到一个CSV文件,由其他程序打开。为此,我编写了以下帮助函数:C:使用fprintf编译器导出大型阵列?,c,export,C,Export,在C语言中,我想将一个1D数组(浮点数)导出到一个CSV文件,由其他程序打开。为此,我编写了以下帮助函数: #include <stdio.h> #include <stdlib.h> void float1DExportCSV(float *ptr, int n){ FILE *f; f = fopen("FloatOutput.CSV", "w"); int i = 0; for (i = 0; i < n-1; i++){
#include <stdio.h>
#include <stdlib.h>
void float1DExportCSV(float *ptr, int n){
FILE *f;
f = fopen("FloatOutput.CSV", "w");
int i = 0;
for (i = 0; i < n-1; i++){
fprintf(f, "%f", ptr[i]);
fprintf(f, "%c", ',');
}
fprintf(f, "%f", ptr[n-1]);
}
#包括
#包括
void float1DExportCSV(float*ptr,int n){
文件*f;
f=fopen(“FloatOutput.CSV”,“w”);
int i=0;
对于(i=0;i
然后我尝试在一个包含10个元素的数组上测试它,如下所示:
#define n 10
int main(void){
float array[n];
int i;
for(i = 0; i < n; i++){
array[i] = 4.3f*i;
}
float1DExportCSV(array, n);
return 1;
}
#定义n 10
内部主(空){
浮点数组[n];
int i;
对于(i=0;i
这可以正常工作,并且生成的文件可以正确打开。将n
更改为更大的数字(最多40万左右)也可以正常工作
然而,在500000元素标记附近的某个地方,程序只是在构建时崩溃。我要导出到CSV的阵列包含超过500000个元素。有没有一种强有力的方式来进行这类出口?像我上面使用的循环
fprintf
方法不是导出大型数据集的好方法吗?当数组大小太大时,使用堆内存
当n
太大时,在堆栈上分配数组会导致堆栈溢出。此时,在堆上分配内存就是答案
而不是
float array[n];
使用
确保释放内存。加
free(array);
一旦使用完数组。您的问题是在堆栈上分配了局部变量。如果对数组使用静态或全局变量,则将在.bss段中分配该变量。对于这个简单的测试用例,不需要malloc()或free()复杂性
#define n 500000
float array[n]; /* or static float array[n]; */
int main(void){
int i;
for(i = 0; i < n; i++){
array[i] = 4.3f*i;
}
float1DExportCSV(array, n);
return 1;
}
#定义n 500000
浮点数组[n];/*或静态浮点数组[n]*/
内部主(空){
int i;
对于(i=0;i
浮点数组[n]代码>:堆栈溢出。很可能是堆栈空间不足。在linux上,您可以使用ulimit-s查看堆栈空间。同样,ulimit-s会将堆栈大小增加到以kB为单位的数字。请注意,通常在成功时从main()
返回0
或EXIT\u SUCCESS
(从
)<代码>1
通常表示故障。这不会影响编译器;它不会影响程序崩溃与否。@JonathanLeffler:Aha,那一定是我的代码崩溃的原因吧!:)更重要的是,谢谢你的提示(我刚刚开始C)。另一个旁注:你可以将循环中的两个fprintf
s组合成一个fprintf
,如下所示:fprintf(f,“%f,”,ptr[I])代码>。换句话说,只要在%f
后面加上逗号就行了。谢谢,我认为这与内存管理问题有关,但我认为问题发生在for
-循环期间,我并不怀疑这只是数组分配步骤本身!堆内存有哪些内存限制?是否只是您的计算机有多少可用内存?从::对于ARM、x86和x64机器,默认堆栈大小为1MB。对于gcc,可以在@DumpsterDoofus中找到这些值:堆栈限制是特定于平台的,通常是可配置的。在Windows上,我相信限制在2 MiB左右(了解情况的人可能会提出矛盾),但在基于Unix的系统上,限制通常更大(如8 MiB)。具体来说,Mac OS X上的默认值是8192 KiB或8 MiB。@JonathanLeffler:Hmm,所以堆限制通常在2MB到8MB之间?这很奇怪,我刚刚导出了一个10000000个元素的浮点数组(或大约40MB,基于32位的浮点大小),没有任何明显的问题。是否有查询堆限制的命令提示符命令?无法键入-我的意思是“Stack”,但写了“heap”;我及时修正了我的评论。
#define n 500000
float array[n]; /* or static float array[n]; */
int main(void){
int i;
for(i = 0; i < n; i++){
array[i] = 4.3f*i;
}
float1DExportCSV(array, n);
return 1;
}