我在一个文件中有一个巨大的数据,我需要读取它并对它做一些概率,所以我需要计算整个文件中每个单词的出现次数,并对其进行更多的计算。这些文件包含100万条记录,每条记录大约有6个字符串。我使用了一个向量来保存这些数据但程序在保存了大约8000条记录后崩溃了。有没有办法在计算机上保存这个向量而不是在程序的内存中?!或者我从搜索中听到了一个叫做符号表的东西,但我无法理解它是什么意思或者如何使用它。
这个问题的任何解决方案?
这是主文件
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <istream>
#include "Tuple.h"
#include "VerbPair.h"
using namespace std;
string filename = "verb-argument-tuples.txt";
vector<Tuple> mytuples;
vector<VerbPair> verbpairs;
vector<Tuple> readTupleFile(string filename)
{
cout << "Started parsing the file of tuples..." << endl;
vector<Tuple> mt;
string temp;
Tuple t;
ifstream infile;
infile.open(filename);
while(!(infile.eof()))
{
getline(infile,temp);
t.parseTuple(temp);
mt.push_back(t);
}
infile.close();
cout << "Done with reading tuples file..." << endl;
return mt;
}
vector<VerbPair> getVerbPairs(vector<Tuple> mytuples)
{
vector<VerbPair> pairs;
bool flag = false;
VerbPair temp;
for(int i=0;i<mytuples.size();i++)
{
flag = false;
for(int h=0;h<pairs.size();h++)
{
if (mytuples[i].verb.compare(pairs[h].verb) == 0)
{
pairs[h].freq += mytuples[i].count;
flag =true;
break;
}
}
if(! flag)
{
temp.verb = mytuples[i].verb;
temp.freq = mytuples[i].count;
pairs.push_back(temp);
}
}
return pairs;
}
int numOfLines(string filename)
{
int numLines = 0;
string j ="";
ifstream infile;
infile.open(filename);
while(!infile.eof())
{
getline(infile,j);
numLines++;
}
infile.close();
return numLines;
}
void train(string filename)
{
mytuples = readTupleFile(filename);
verbpairs = getVerbPairs(mytuples);
}
void store(string filename)
{
}
void load(string filename)
{
}
int main()
{
cout << "Started Application..." << endl;
train(filename);
cout << "Size of verb pairs is " << verbpairs.size() << endl;
}
Tuple.h
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <istream>
using namespace std;
class Tuple
{
public:
int count;
string verb;
string frame;
vector<string> args;
private:
int i;
int h;
string p;
public:
void parseTuple(string s)
{
cout << "parsing.... " << s << endl;
i=0;
h=0;
p="";
while(s[i] != 32 && s[i]!= 9) //that means temp[i] is a number
{
h = h*10 + (s[i] - '0');
i++;
}
this->count = h;
i++;
// loops for everything but not the space and tab
while(s[i] != 32 && s[i]!= 9)
{
p +=s[i];
i++;
}
this->verb = p;
i++;
p="";
while(s[i] != 32 && s[i]!= 9)
{
p +=s[i];
i++;
}
this->frame = p;
i++;
p="";
while(i < s.length())
{
while(s[i] != 32 && s[i]!= 9 && i < s.length())
{
p += s[i];
i++;
}
this->args.push_back(p);
i++;
p="";
}
}
};
和VerbPair.h
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <istream>
using namespace std;
class VerbPair
{
public:
string verb;
int freq;
};
答案 0 :(得分:1)
您可以尝试使用带向量的保留功能。由于您可能知道您有大量数据,因此您还应该使用保留功能。
此外,在这种情况下使用地图,因为使用地图,您将能够轻松计算出现次数。
对于崩溃,您必须向我们展示代码。
答案 1 :(得分:0)
由于存在重复数据,为什么使用vector
。只需使用map<string,int>
即可。每次遇到单词时,都要在地图中增加相应的值。
答案 2 :(得分:0)
您的代码中有很多阴影变量,比如您全局声明filename
变量然后在本地三行后使用它。你用元组向量和verbpair向量做同样的事情。
也许某些封装会使您的调试任务更容易。
另一个样式问题是如下函数:
vector<VerbPair> getVerbPairs(vector<Tuple> mytuples)
{
vector<VerbPair> pairs;
bool flag = false;
VerbPair temp;
for(int i=0;i<mytuples.size();i++)
{
flag = false;
for(int h=0;h<pairs.size();h++)
{
if (mytuples[i].verb.compare(pairs[h].verb) == 0)
{
pairs[h].freq += mytuples[i].count;
flag =true;
break;
}
}
if(! flag)
{
temp.verb = mytuples[i].verb;
temp.freq = mytuples[i].count;
pairs.push_back(temp);
}
}
return pairs;
}
有些事情使得调试变得困难。第一个是阴影的东西,第二个是你不让编译器帮助你。
vector<VerbPair> getVerbPairs(const vector<Tuple>& mytuples)
{
vector<VerbPair> pairs;
bool flag = false;
VerbPair temp;
for(int i=0;i<mytuples.size();i++)
{
flag = false;
for(int h=0;h<pairs.size();h++)
{
if (mytuples[i].verb.compare(pairs[h].verb) == 0)
{
pairs[h].freq += mytuples[i].count;
flag =true;
break;
}
}
if(! flag)
{
temp.verb = mytuples[i].verb;
temp.freq = mytuples[i].count;
pairs.push_back(temp);
}
}
return pairs;
}
这样编译器会告诉你是否尝试使用mytupes向量。