我正在实现一个map/reduce并行项目。然而,对于字数玩具示例,使用(或多或少)1GB的输入文件,只有一个映射器(映射整个文件),我会收到std::bad_alloc
异常。不幸的是,这种情况只发生在远程Xeon Phi(RAM较小)上,因此没有深度调试。
然而,内存被占用在两个位置:当映射器读取(存储)char *
:中的整个文件时
void getNextKeyValue() {
key = pos;//int
value = new char[file_size];//file_size only with 1 mapper
ssize_t result = pread(fd, value, file_size, pos);
assert(result == ( file_size ) );
morePairs = false;
}
另一个是当调用map
函数并将一系列pair<char*,int>
存储在vector
中作为映射的结果时:
地图功能:
std::function<void(int key, char *value,MapResult<int,char*,char*,int> *result)> map_func = [](int key,char *value,MapResult<int,char*,char*,int> *result) {
const char delimit[]=" trnvf";
char *token , *save;
token = strtok_r(value, delimit, &save);
while (token != NULL){
result->emit(token,1);
token = strtok_r (NULL,delimit, &save);
}
};
emit
实现(以及地图的结果生成):
void emit(char* key, int value) {
res.push_back(pair<char*,int>(key,value));
}
...
private:
vector<pair<char*,int>> res;
注意:通常emit
中的key
和value
是基于模板的,但在本例中,为了简洁起见,我省略了它们。
首先,我认为std::bad_alloc
是因为char *value
(占用1GB)而抛出的,但异常是在value
分配之后放置的测试cout
消息之后抛出的(所以没有问题)。
根据我所读到的关于strtok
实现的内容,原始char*
被修改(在每个令牌的末尾添加