1

我已经阅读了大约 120k 字的文件,所以我尝试快速完成。看过:

int x = setvbuf(fp, (char *)NULL, _IOFBF, BSZ);
assert( x == 0 && fp != NULL );

选项,但它需要超过一秒钟(1 mb 文件)所以现在我尝试了这种方法:

fopen_s (&pFile,DICT,"rb");
if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

// obtain file size:
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);

// allocate memory to contain the whole file:
buffer = (char*) malloc (sizeof(char)*lSize);

// copy the file into the buffer:
result = fread (buffer,1,lSize,pFile);

我如何从这里继续?缓冲区包含一个单词列表,我想尽可能快地一个一个地获取它们,因为我用这些单词构建了一个多重映射。

谢谢你!

4

3 回答 3

1

您的代码本质上是在实现mmap(). 它的美妙之mmap()处在于它会在需要时将实际页面加载到内存中。如果您的应用程序以非常快的速度顺序读取它们,则操作系统将尽可能快地映射页面。

#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define handle_error(msg) \
    { perror(msg); exit(EXIT_FAILURE); }

int
main(void)
{
    int fd = open("english-words.10", O_RDONLY);
    if (fd == -1)
        handle_error("open");

    struct stat sb;
    if (fstat(fd, &sb) == -1)
        handle_error("fstat");
    size_t lSize = sb.st_size;

    char* buffer = mmap(NULL, lSize, PROT_READ, MAP_PRIVATE, fd, 0);
    if (buffer == MAP_FAILED)
        handle_error("mmap");

    // insert your mapping to a map here

    munmap(buffer, lSize);

    return 0;
}

请注意,我也使用fstat()而不是您的fseek/ ftell

于 2012-05-14T16:44:36.720 回答
0

将单词分开不会成为瓶颈。任何合理的实现都将比 SSD 更快。

于 2012-05-13T22:21:01.793 回答
0

我会像这样阅读所有单词:

#include <vector>
#include <string>
#include <fstream>

using namespace std;  // that's the way I like it... :-)

int main()
{
    vector<string> v;   // all the words
    string word;
    ifstream f("myfile.txt");  // open stream for input

    while (f) {
        f >> word;          // read word
        if (!f) break;
        v.push_back(word);  // push word into vector
    }

    // now v holds all the words in the file, and you can iterate them

    return 0;
}
于 2012-05-13T22:29:17.567 回答