我正在开发一个应用程序,其中我需要比较10 ^ 8个条目(字母数字条目)。要从文件中检索条目(文件大小为1.5 GB)然后进行比较,我需要花费不到5分钟的时间。那么,有效的方法是什么,因为,只检索时间超过5分钟。我只需要处理文件。请建议一个出路。 我正在使用3GB RAM和100Gb硬盘的Windows上工作。
答案 0 :(得分:5)
答案 1 :(得分:1)
不包括错误处理和标头包含。您需要提供DataType
和cmpfunc
,并提供样本。您应该能够从此片段中推断出核心工作原理:
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
typedef char DataType; // is this alphanumeric?
int cmpfunc(char const *left, char const *right)
{
return *right - *left;
}
int main(int argc, char **argv)
{
int fd = open(argv[1], O_RDWR|O_LARGEFILE);
if (fd == -1)
return 1;
struct stat st;
if (fstat(fd, &st) != 0)
return 1;
DataType *data = mmap(NULL, st.st_size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
if (!data)
return 1;
qsort(data, st.st_size / sizeof(*data), cmpfunc);
if (0 != msync(data, st.st_size, MS_SYNC))
return 1;
if (-1 == munmap(data, st.st_size))
return 1;
if (0 != close(fd))
return 1;
return 0;
}
我无法想象你能比这更快。确保你有足够的虚拟内存地址空间(1.5GB正在推动它,但可能只适用于32位Linux,你可以在任何64位操作系统上管理它)。请注意,此代码“限于”在符合POSIX标准的系统上工作。
在C和效率方面,这种方法将整个操作放在操作系统和优秀的qsort
算法中。
答案 2 :(得分:0)
如果检索时间超过5分钟,您似乎需要查看如何阅读此文件。导致性能不佳的一件事是,C实现有时会默认使用线程安全的I / O操作,并且您可以通过使用线程不安全的I / O来获得一些速度。
这将运行什么样的计算机?现在很多计算机都有几千兆字节的内存,所以也许只需将它全部读入内存然后在那里排序(例如qsort)?