【发布时间】:2016-07-03 00:37:55
【问题描述】:
我需要读取几个输入文件(每个文件都包含一个二维整数矩阵)并将它们存储在一个二维向量的向量中。下面是我写的代码:
int main(int argc, char *argv[]) {
/*
int my_rank;
int p;
MPI_Init(&argc, &argv);
MPI_Comm_rank(MPI_COMM_WORLD, &my_rank);
MPI_Comm_size(MPI_COMM_WORLD, &p);
*/
std::vector<std::vector<std::vector<int > > > matrices(argc);
for(int i=1; i<argc; ++i){
std::string line;
std::ifstream fp(argv[i]);
std::vector<std::vector<int> > matrix;
if (fp.is_open()) {
while (getline(fp, line)) {
if(line!=""){
//add a new row to file
std::vector<int> newRow;
//parse each row put the values in the file buffer
std::stringstream buff(line);
//buffValue is each number in a row
int buffValue;
while (buff >> buffValue) {
newRow.push_back(buffValue);
}
matrix.push_back(newRow);
}
}
}
else {
std::cout << "Failed to read files" << std::endl;
}
matrices.push_back(matrix);
}
//MPI_Finalize();
return 0;
}
我有两个问题:
当我读入一个 175M 的文件时,程序最终在常驻内存中占用了 900M。这是一个问题,因为我通常需要读取 4 个文件,每个文件有几百个 M。它最终会占用多个 G 的内存。这是因为我读取/存储整数的方式吗?
如果我取消注释涉及 MPI 的行,则常驻内存使用量上升到 1.7G,这是正常的还是我在这里做错了,我正在使用 MPICH。
【问题讨论】:
-
纯文本文件中的数字
1占用一个字节,但int a = 1;可能占用四个字节的内存。只有一个原因。 -
@JonathanPotter 嗨乔纳森,这是否意味着文件中的四位数字 1234 占用与 int a=1234 相同的内存量; ?
-
代码可能会导致堆碎片化。在创建
vector对象时尝试预分配空间:std::vector<int> newRow(best_guess);等,其中best_guess是对要进入的元素数量的猜测。 -
@IanLi ,假设典型的 ASCII 编码和 32 位
int,是的。 4 个字符将是 4 个字节,int将是 4 个字节。您可能还有一个 64 位(8 字节)int,具体取决于您的平台和编译器选项。 -
离题:既然您使用的是 MPI,我假设您的目标是速度。因为
vector的vectors 不是连续存储(每个vector指向它自己分配的内存块),当您从一个向量遍历到下一个向量时,您可能会受到性能损失。如果数据中的每一行长度相同,您可以分配一维数组并使用row * numberColumns + column伪造二维索引。这样可以将所有数据保存在一个大块中,并使 CPU 轻松预测和缓存。
标签: c++ memory-management vector mpi