gpt4 book ai didi

c - 非常慢的数据处理

转载 作者:太空宇宙 更新时间:2023-11-04 03:44:19 25 4
gpt4 key购买 nike

考虑以下将记录数据集加载到缓冲区并为每条记录创建 Record 对象的代码。一条记录构成一个或多个列,并且此信息在运行时被发现。但是,在这个特定示例中,我将列数设置为 3。

typedef unsigned int uint;

typedef struct
{
uint *data;

} Record;

Record *createNewRecord (short num_cols);

int main(int argc, char *argv[])
{
time_t start_time, end_time;
int num_cols = 3;
char *relation;
FILE *stream;
int offset;

char *filename = "file.txt";
stream = fopen(filename, "r");
fseek(stream, 0, SEEK_END);
long fsize = ftell(stream);
fseek(stream, 0, SEEK_SET);

if(!(relation = (char*) malloc(sizeof(char) * (fsize + 1))))
printf((char*)"Could not allocate buffer");

fread(relation, sizeof(char), fsize, stream);
relation[fsize] = '\0';
fclose(stream);

char *start_ptr = relation;
char *end_ptr = (relation + fsize);

while (start_ptr < end_ptr)
{
Record *new_record = createNewRecord(num_cols);

for(short i = 0; i < num_cols; i++)
{
sscanf(start_ptr, " %u %n",
&(new_record->data[i]), &offset);

start_ptr += offset;
}
}

Record *createNewRecord (short num_cols)
{
Record *r;

if(!(r = (Record *) malloc(sizeof(Record))) ||
!(r->data = (uint *) malloc(sizeof(uint) * num_cols)))
{
printf(("Failed to create new a record\n");
}

return r;
}

此代码效率极低。我的数据集包含大约 3100 万条记录(约 1 GB),而此代码每分钟仅处理约 200 条记录。我将数据集加载到缓冲区中的原因是因为稍后我将有多个线程处理该缓冲区中的记录,因此我想避免文件访问。而且,我有48GB的RAM,所以内存中的数据集应该不是问题。关于如何加快速度的任何想法?

解决方案:sscanf 函数实际上非常缓慢且效率低下。当我切换到 strtoul 时,作业在不到一分钟内完成。 Malloc-ing ~ 300 万个 Record 类型的结构只用了几秒钟。

最佳答案

确信文件中存在潜伏的非数字数据。

int offset;
...
sscanf(start_ptr, " %u %n", &(new_record->data[i]), &offset);
start_ptr += offset;

请注意,如果文件以非数字输入开头,则永远不会设置offset,如果它的值为0,则start_ptr += offset; 永远不会递增。

如果文件后面存在非数字数据,如“3x”,offset 将得到1 的值,并导致 while 循环缓慢进行 for它永远不会获得更新的值。

最好检查 fread()ftell()sscanf() 的结果是否有意外返回值并采取相应措施。

进一步:long fsize 可能太小了。查看使用 fgetpos()fsetpos()

注意:为了节省处理时间,请考虑使用 strtoul(),因为它肯定比 sscanf("%u %n") 更快。再次 - 检查错误结果。

顺便说一句:如果代码需要使用sscanf(),请使用sscanf("%u%n"),速度稍快且用于您的代码和相同的功能。

关于c - 非常慢的数据处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26026030/

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