Skip to content

Commit dca7c18

Browse files
committed
Create merge script in parallel json output
1 parent f65ce01 commit dca7c18

File tree

1 file changed

+69
-1
lines changed

1 file changed

+69
-1
lines changed

src/IO/JSON/JSONIOHandlerImpl.cpp

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,11 @@
3737
#include "openPMD/backend/Writable.hpp"
3838
#include "openPMD/toolkit/ExternalBlockStorage.hpp"
3939

40+
#if openPMD_USE_FILESYSTEM_HEADER
41+
#include <filesystem>
42+
#endif
4043
#include <iomanip>
44+
#include <ios>
4145
#include <sstream>
4246
#include <toml.hpp>
4347

@@ -2581,7 +2585,7 @@ merge the .json files somehow (no tooling provided for this (yet)).
25812585
readme_file.open(
25822586
dirpath + "/README.txt",
25832587
std::ios_base::out | std::ios_base::trunc);
2584-
readme_file << readme_msg + 1;
2588+
readme_file << &readme_msg[1];
25852589
readme_file.close();
25862590
if (!readme_file.good() &&
25872591
!filename.fileState->printedReadmeWarningAlready)
@@ -2595,6 +2599,70 @@ merge the .json files somehow (no tooling provided for this (yet)).
25952599
<< readme_msg + 1 << "----------" << std::endl;
25962600
filename.fileState->printedReadmeWarningAlready = true;
25972601
}
2602+
2603+
constexpr char const *merge_script = R"END(
2604+
#!/usr/bin/env bash
2605+
2606+
set -euo pipefail
2607+
2608+
parallel_dir="$(dirname "$BASH_SOURCE")"
2609+
parallel_dir="$(cd "$parallel_dir" && pwd)"
2610+
serial_dir="${parallel_dir%.json.parallel}"
2611+
if [[ "$serial_dir" = "$parallel_dir" ]]; then
2612+
serial_dir="$parallel_dir/merged.json"
2613+
else
2614+
serial_dir="$serial_dir.json"
2615+
fi
2616+
echo "Will merge files to '$serial_dir'." >&2
2617+
if [[ -e "$serial_dir" ]]; then
2618+
echo "Target dir already exists, aborting." >&2
2619+
exit 1
2620+
fi
2621+
if ! which openpmd-merge-json 2>/dev/null; then
2622+
echo "Did not find 'openpmd-merge-json' on PATH, aborting." >&2
2623+
exit 1
2624+
fi
2625+
for file in "$parallel_dir"/mpi_rank_*.json; do
2626+
echo "@$file"
2627+
done |
2628+
xargs openpmd-merge-json >"$serial_dir"
2629+
# TODO: xargs will only work up to a certain number of files)END";
2630+
std::string const merge_script_path = dirpath + "/merge.sh";
2631+
std::fstream merge_file;
2632+
merge_file.open(
2633+
merge_script_path, std::ios_base::out | std::ios_base::trunc);
2634+
merge_file << &merge_script[1];
2635+
merge_file.close();
2636+
2637+
if (!merge_file.good() &&
2638+
!filename.fileState->printedReadmeWarningAlready)
2639+
{
2640+
std::cerr
2641+
<< "[Warning] Something went wrong in trying to create "
2642+
"merge script at '"
2643+
<< merge_script_path << "'. Will ignore and continue."
2644+
<< std::endl;
2645+
filename.fileState->printedReadmeWarningAlready = true;
2646+
}
2647+
2648+
#if openPMD_USE_FILESYSTEM_HEADER
2649+
try
2650+
{
2651+
std::filesystem::permissions(
2652+
merge_script_path,
2653+
std::filesystem::perms::owner_exec |
2654+
std::filesystem::perms::owner_exec |
2655+
std::filesystem::perms::owner_exec,
2656+
std::filesystem::perm_options::add);
2657+
}
2658+
catch (std::filesystem::filesystem_error const &e)
2659+
{
2660+
std::cerr << "Failed setting executable permissions on '"
2661+
<< merge_script_path
2662+
<< "', will ignore. Original error was:\n"
2663+
<< e.what() << std::endl;
2664+
}
2665+
#endif
25982666
}
25992667
};
26002668

0 commit comments

Comments
 (0)