gpt4 book ai didi

C高效读取20000000行文件的方法

转载 作者:行者123 更新时间:2023-11-30 16:26:35 24 4
gpt4 key购买 nike

我正在尝试读取包含 2000 万行的巨大数据集,每行都有一个巨大的数字(实际上我将数字存储在 unsigned long long 变量中),例如:1774251443、8453058335、19672843924,等等...

我开发了一个简单的函数来执行此操作,我将在下面展示

void read(char pathToDataset[], void **arrayToFill, int arrayLength) {
FILE *dataset = fopen(pathToDataset, "r");
if (dataset == NULL ) {
printf("Error while opening the file.\n");
exit(0); // exit failure, it closes the program
}

int i = 0;

/* Prof. suggestion: do a malloc RIGHT HERE, for allocate a
* space in memory in which store the element
* to insert in the array
*/

while (i < arrayLength && fscanf(dataset, "%llu", (unsigned long long *)&arrayToFill[i]) != EOF) {

// ONLY FOR DEBUG, it will print
//printf("line: %d.\n", i); 20ML of lines!

/* Prof. suggestion: do another malloc here,
* for each element to be read.
*/

i++;
}

printf("Read %d lines", i);
fclose(dataset);
}

由于练习目标,参数 arrayToFill 的类型为 void**。每个函数都必须在泛型类型上执行,并且数组可能会填充每种类型的数据(在本例中是巨大的数字,但它可能包含巨大的字符串、整数等......)。

我不明白为什么我必须执行 2 次 malloc 调用,一次还不够吗?

最佳答案

对于你的第一个问题,请考虑 malloc调用内存来存储 N 个对象,所有对象的大小均为 S。当您有参数 void ** arrayToFill, int arrayLength 时,你是说这个数组将包含 arrayLength 数量大小为 sizeof(void*) 的指针。这是第一次分配和调用 malloc。

但是该数组的成员是指针,它们用于保存数组或其他对象本身的内存。第一次调用 malloc 仅分配内存来存储 void*每个数组成员的内存,但数组的每个单独成员的内存都需要它自己的 malloc()打电话。

高效的行读取

对于你的另一个问题,进行大量的小内存分配,然后释放它们(假设你会这样做,否则你会泄漏大量内存),是非常慢的。但是,I/O 相关任务的性能影响更多地取决于调用次数,而不是您分配的内存量。

让你的程序将整个文件读入内存,并分配一个 unsigned long long 的数组。 2000 万,或者您期望处理的任意数量的整数。这样,您就可以解析文件内容,使用 strtol来自 <stdlib.h> 的函数,并将生成的 long 逐一复制到您的大数组中。

这样,您只需使用 2-3 次大内存分配和释放。

关于C高效读取20000000行文件的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53013981/

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