ModelValidation: remove a map file before writing it again, rather than truncating it
The validation in the model's setting writes its three maps and the map MTZ over the ones the first validation wrote seconds before, and a two-pass run writes over the first pass's. XFS (like ext4) flushes a file that was truncated and rewritten when it is closed, so each overwrite forced ~155 MB out to the disk on the spot. Measured on /data (XFS on a hard disk): three 155 MB files rewritten 3.16 s, written fresh 0.62 s, removed and written again 0.66 s. The contents are the same bytes either way. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SVmAWnzCmRKAXVUCdc4iNi
This commit is contained in:
@@ -7,6 +7,7 @@
|
||||
#include <algorithm>
|
||||
#include <cmath>
|
||||
#include <complex>
|
||||
#include <cstdio>
|
||||
#include <array>
|
||||
#include <atomic>
|
||||
#include <functional>
|
||||
@@ -59,11 +60,20 @@ gemmi::Grid<float> map_from_coefficients(gemmi::AsuData<std::complex<float>> &co
|
||||
return MapFromFPhi(gemmi::get_f_phi_on_grid<float>(coef, size, true));
|
||||
}
|
||||
|
||||
// A file this run may already have written - the validation in the model's setting writes over the
|
||||
// first one's maps - is removed before it is written again, not truncated: XFS (and ext4) flush a file
|
||||
// truncated and rewritten when it is closed, and three 150 MB maps forced out to a disk that way cost
|
||||
// seconds where a fresh file costs nothing.
|
||||
void remove_before_rewriting(const std::string &path) {
|
||||
std::remove(path.c_str());
|
||||
}
|
||||
|
||||
// Write a map as CCP4; return its RMS (the sigma the map is read in).
|
||||
double write_ccp4(const gemmi::Grid<float> &map, const std::string &path) {
|
||||
gemmi::Ccp4<float> ccp4;
|
||||
ccp4.grid = map;
|
||||
ccp4.update_ccp4_header(2);
|
||||
remove_before_rewriting(path);
|
||||
ccp4.write_ccp4_map(path);
|
||||
return ccp4.hstats.rms;
|
||||
}
|
||||
@@ -1466,6 +1476,7 @@ ModelValidationResult Validate(const std::vector<MergedReflection> &merged,
|
||||
}
|
||||
mtz.nreflections = static_cast<int>(terms.size());
|
||||
mtz.data = std::move(data);
|
||||
remove_before_rewriting(output_prefix + "_maps.mtz");
|
||||
mtz.write_to_file(output_prefix + "_maps.mtz");
|
||||
} catch (const std::exception &e) {
|
||||
logger.Warning("Model validation: could not write map MTZ: {}", e.what());
|
||||
|
||||
Reference in New Issue
Block a user