我有点被困在这里。
我需要将大约200万个固定长度的字符串加载到一个数组中,字符串位于一行的文本文件中。 字符串是十六进制的,长度为40个字符。
在ansi c中实现这一目标的最佳方法是什么?
查找速度很重要。
加载字符串后,我必须在整个数组中搜索循环生成的匹配项。
我有两个文件让我们说一个bigfile和hugefile,都包含十六进制值(哈希),我用这段代码循环遍历hugefile。
....
FILE *file;
if ( (file = fopen(filenamein, "r") ) == 0 )
{
fprintf(stderr, "%s: failed to open file %s\n", argv[0], filenamein);
exit(1);
}
while ( fgets(keyword, sizeof(keyword), file) != NULL )
{
if ( ( pos = strchr(keyword, '\n') ) != NULL )
*pos = '\0';
....
}
....
在需要在bigfile中查找关键字之后,lookuptime是一个关键因素。 根据我到目前为止所学到的,该文件对于堆栈来说很重要。
答案 0 :(得分:1)
根据您的具体需求,可能有一种方法可以在不加载内存中的所有内容的情况下执行此操作。你没有提供足够的信息来走这条路。
但是,假设您要将所有内容加载到内存中,我可能会尝试将行转换为二进制。如果它们包含十六进制数字,那么它们可能转换为整数或长整数,或者可能是整数数组。整数将使用更少的内存,并且可以更快地进行比较,以便加快搜索速度。
另一种可能有意义的方法是对结果整数进行排序。即使您决定存储字符串,也可以对它们进行排序。可以使用binary search algorithm搜索已排序的项目,这比蛮力搜索要快许多倍。
请注意,排序需要一些时间。因此,只有在计划加载数据一次然后快速搜索数据时,这种方法才有意义。