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