Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;-我读了一个完整的文件(_是一个单词列表,由两个空格分隔),如何快速地将单词分开?_C++_Performance_File_Buffer_Multimap - Fatal编程技术网

C++ C++;-我读了一个完整的文件(_是一个单词列表,由两个空格分隔),如何快速地将单词分开?

C++ C++;-我读了一个完整的文件(_是一个单词列表,由两个空格分隔),如何快速地将单词分开?,c++,performance,file,buffer,multimap,C++,Performance,File,Buffer,Multimap,我读过一个大约有12万字的文件,所以我试着快速完成。 我们已经看到了: 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);}

我读过一个大约有12万字的文件,所以我试着快速完成。 我们已经看到了:

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);
我如何从这里继续? 缓冲区包含一个单词列表,我希望尽快一个接一个地获取它们 因为我正在用这些词构建一个多重地图


谢谢大家!

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

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

我会这样读:

#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;
}
#包括
#包括
#包括
使用命名空间std;//这就是我喜欢的方式…:-)
int main()
{
向量v;//所有的单词
字符串字;
ifstream f(“myfile.txt”);//打开流进行输入
while(f){
f>>word;//读取word
如果(!f)中断;
v、 推回(单词);//将单词推入向量
}
//现在v保存文件中的所有单词,您可以迭代它们
返回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;
}
#包括
#包括
#包括
使用命名空间std;//这就是我喜欢的方式…:-)
int main()
{
向量v;//所有的单词
字符串字;
ifstream f(“myfile.txt”);//打开流进行输入
while(f){
f>>word;//读取word
如果(!f)中断;
v、 推回(单词);//将单词推入向量
}
//现在v保存文件中的所有单词,您可以迭代它们
返回0;
}

您的代码基本上实现了
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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义句柄错误(msg)\
{perror(msg);退出(退出失败);}
int
主(空)
{
int fd=开放(“仅限英语单词10”);
如果(fd==-1)
处理错误(“打开”);
结构统计某人;
如果(fstat(fd和sb)=-1)
处理错误(“fstat”);
尺寸=标准尺寸;
char*buffer=mmap(NULL,lSize,PROT_READ,MAP_PRIVATE,fd,0);
if(buffer==MAP_失败)
处理错误(“mmap”);
//在此处将地图插入地图
munmap(缓冲区,lSize);
返回0;
}

请注意,我还使用了
fstat()
而不是您的
fseek
/
ftell
您的代码基本上实现了
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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#定义句柄错误(msg)\
{perror(msg);退出(退出失败);}
int
主(空)
{
int fd=开放(“仅限英语单词10”);
如果(fd==-1)
处理错误(“打开”);
结构统计某人;
如果(fstat(fd和sb)=-1)
处理错误(“fstat”);
尺寸=标准尺寸;
char*buffer=mmap(NULL,lSize,PROT_READ,MAP_PRIVATE,fd,0);
if(buffer==MAP_失败)
处理错误(“mmap”);
//在此处将地图插入地图
munmap(缓冲区,lSize);
返回0;
}

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

您的约束条件是什么(即您需要多快)?到目前为止,您尝试了什么?结果超出了性能水平有多远?是否存在两个单词被一个空格分隔的情况,需要将其视为一个单词?这就是两个空格的原因吗?每个单词前面总是有两个空格,还是每个单词后面总是有两个空格?或者两个空格的单词分隔符只在非空单词之间?您的限制条件是什么(即,您需要多快)?到目前为止,您尝试了什么?结果超出了性能水平有多远?是否存在两个单词被一个空格分隔的情况,需要将其视为一个单词?这就是两个空格的原因吗?每个单词前面总是有两个空格,还是每个单词后面总是有两个空格?或者两个空格的单词分隔符只是在非空单词之间吗?每次循环迭代都要测试两次流状态。当(f>>word){v.push_back(word)}每次循环迭代测试流状态两次时,只说
更简单。当(f>>单词){v.push_back(单词);}