每第 n 次迭代将输出写入新文件
Write output to new files at every nth iteration
我的代码片段是:
for (int iter = 0; iter < flags.total_iterations_; ++iter) {
if (iter%20==0) {
std::ofstream mf(flags.model_file_.c_str());
accum_model.AppendAsString(word_index_map, mf); }
else {
std::cout << "Model not created for "; }
std::cout << "Iteration " << iter << " ...\n";
因此,我尝试在每 20 次迭代时从方法 accum_model 生成输出。但是,问题是每次达到第 20 次迭代时我都必须将输出写入新文件。现在,我的输出被覆盖了。
我在可执行文件的帮助下执行这段代码,如下所示:
./lda --num_topics 15 --alpha 0.1 --beta 0.01 --training_data_file testdata/test_data.txt --model_file MF/lda_model.txt --burn_in_iterations 120 --total_iterations 150
MF/lda_model.txt 是给定的输出文件。我不明白如何 link 包含代码和此可执行命令的文件,因为我需要 5 个不同的新文件(对于 100 次迭代 - 因为数据每 20 次迭代写入一个新文件)。
我是编码新手,到目前为止,我是在 python 中编码的。我一直尝试到这个循环,我对如何创建新文件并获得相应的输出感到困惑。请帮忙!提前致谢。
如果我对你的问题的理解正确,那么你是在覆盖 ofstream 而不是附加到它。
您需要在 ofstream 构造函数的模式中指定 'app' 标志:
std::ofstream mf(flags.model_file_.c_str(), std::ios_base::app);
如果您需要从一个新的 "empty" 文件开始输出,只需省略模式(ofstream 默认为 std::ios_base:out,无论您是否指定):std::ofstream::ofstream
...如果您需要一个新的输出文件(根据您的 OP),您需要更改 flags.model_file_ 中的文件名。
使用std::stringstream,每次打开都要新建一个文件名。
std::string uniquePathFileNamePostFix (int i) {
std::stringstream ss;
ss << '-' << i ;
return (ss.str());
}
想法是使用字符串流创建(或追加或前置)一个基于 i 的唯一修饰符。 (或任何其他方便的 - 我使用了时间戳)。
我不确定我是否正确理解了你的问题,但我认为你想在新文件中每 20 次迭代输出一次。为此,您只需将 iter
的值附加到文件名或以其他方式向其添加 "dynamic" 元素。
仅使用标准 C++ 的方法是使用字符串流:
std::stringstream file_name;
file_name << flags.model_file_ << iter;
result = file_name.str();
我的代码片段是:
for (int iter = 0; iter < flags.total_iterations_; ++iter) {
if (iter%20==0) {
std::ofstream mf(flags.model_file_.c_str());
accum_model.AppendAsString(word_index_map, mf); }
else {
std::cout << "Model not created for "; }
std::cout << "Iteration " << iter << " ...\n";
因此,我尝试在每 20 次迭代时从方法 accum_model 生成输出。但是,问题是每次达到第 20 次迭代时我都必须将输出写入新文件。现在,我的输出被覆盖了。
我在可执行文件的帮助下执行这段代码,如下所示:
./lda --num_topics 15 --alpha 0.1 --beta 0.01 --training_data_file testdata/test_data.txt --model_file MF/lda_model.txt --burn_in_iterations 120 --total_iterations 150
MF/lda_model.txt 是给定的输出文件。我不明白如何 link 包含代码和此可执行命令的文件,因为我需要 5 个不同的新文件(对于 100 次迭代 - 因为数据每 20 次迭代写入一个新文件)。
我是编码新手,到目前为止,我是在 python 中编码的。我一直尝试到这个循环,我对如何创建新文件并获得相应的输出感到困惑。请帮忙!提前致谢。
如果我对你的问题的理解正确,那么你是在覆盖 ofstream 而不是附加到它。
您需要在 ofstream 构造函数的模式中指定 'app' 标志:
std::ofstream mf(flags.model_file_.c_str(), std::ios_base::app);
如果您需要从一个新的 "empty" 文件开始输出,只需省略模式(ofstream 默认为 std::ios_base:out,无论您是否指定):std::ofstream::ofstream
...如果您需要一个新的输出文件(根据您的 OP),您需要更改 flags.model_file_ 中的文件名。
使用std::stringstream,每次打开都要新建一个文件名。
std::string uniquePathFileNamePostFix (int i) {
std::stringstream ss;
ss << '-' << i ;
return (ss.str());
}
想法是使用字符串流创建(或追加或前置)一个基于 i 的唯一修饰符。 (或任何其他方便的 - 我使用了时间戳)。
我不确定我是否正确理解了你的问题,但我认为你想在新文件中每 20 次迭代输出一次。为此,您只需将 iter
的值附加到文件名或以其他方式向其添加 "dynamic" 元素。
仅使用标准 C++ 的方法是使用字符串流:
std::stringstream file_name;
file_name << flags.model_file_ << iter;
result = file_name.str();