如何检索大文件

时间:2010-08-30 14:42:50

标签: c

我正在开发一个应用程序,其中我需要比较10 ^ 8个条目(字母数字条目)。要从文件中检索条目(文件大小为1.5 GB)然后进行比较,我需要花费不到5分钟的时间。那么,有效的方法是什么,因为,只检索时间超过5分钟。我只需要处理文件。请建议一个出路。 我正在使用3GB RAM和100Gb硬盘的Windows上工作。

3 个答案:

答案 0 :(得分:5)

  • 读取文件的一部分,对其进行排序,将其写入临时文件。
  • 合并生成的文件。

答案 1 :(得分:1)

不包括错误处理和标头包含。您需要提供DataTypecmpfunc,并提供样本。您应该能够从此片段中推断出核心工作原理:

#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)?