gpt4 book ai didi

c - 从文件中读取 4,000,000,000 行并保存到 C 语言的数组中

转载 作者:行者123 更新时间:2023-11-30 18:51:00 26 4
gpt4 key购买 nike

我需要从文件中读取 4,000,000,000 行并将它们保存到数组中。

但是Linux内核因为内存不足而杀死了该进程:

tail /var/log/kern.log
... Out of memory: Kill process ...

代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>


int main() {

/*
* Read line by line from the file and write into the array
*/

int lines_allocated = 128;
int max_line_len = 15;

char **array = (char **)malloc(sizeof(char*)*lines_allocated);
if (array==NULL) {
fprintf(stderr,"Out of memory (1).\n");
exit(1);
}

file = fopen("file", "r");
if (file == NULL) {
fprintf(stderr,"Error opening file.\n");
exit(2);
}

int il;
for (il=0;1;il++) {
int j;

/* Have we gone over our line allocation? */
if (il >= lines_allocated) {
int new_size;

/* Double our allocation and re-allocate */
new_size = lines_allocated*2;
array = (char **)realloc(array,sizeof(char*)*new_size);
if (array==NULL){
fprintf(stderr,"Out of memory.\n");
exit(3);
}
lines_allocated = new_size;
}

/* Allocate space for the next line */
array[il] = malloc(max_line_len);
if (array[il]==NULL)
{
fprintf(stderr,"Out of memory (3).\n");
exit(4);
}
if (fgets(array[il], max_line_len-1, file)==NULL)
break;

/* Get rid of CR or LF at end of line */
for (j=strlen(array[il])-1;j>=0 && (array[il][j]=='\n' || array[il][j]=='\r');j--)
;

array[il][j+1]='\0';
}

/* Close login file */
fclose(file);

/* Print the array of data from the file */
for (i=0; i < il; i++)
printf("%s\n", array[i]);

return 0;
}

最合适、最有效的方法是什么?也许读取第一个 block ,完成后,然后读取下一个 block ,依此类推?

这个问题有什么解决办法吗?

最佳答案

假设您从每一行读取一个字节,则需要 29GB 内存。

对于如此庞大的数据,加载尽可能少量的数据至关重要,然后在处理结束后释放内存。否则你会错过内存。

关于c - 从文件中读取 4,000,000,000 行并保存到 C 语言的数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38461267/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com