dolfin team mailing list archive
-
dolfin team
-
Mailing list archive
-
Message #11051
Re: Temporary files
Looks very good. I've applied the patch.
--
Anders
On Tue, Dec 09, 2008 at 12:30:39AM +0100, Joachim B Haga wrote:
> These last days, /tmp on the buildbots have started filling up again, at a rate
> of ~300MB per build. The attached patch should fix that (again!).
>
> It doesn't to work, but as far as I can tell it didn't work before either. And
> now at least it fails cleanly, without leaving any files behind.
>
> (f=Function('file.xml'); plot(f) -> 'str' object has no attribute 'element')
>
> I did make an effort to make it more readable (code generation by fprintf is
> hard to read) by moving the logic from the code generation down to the python
> level.
>
> If this patch is not to your liking, please fix it in some other way, so I
> don't have to bug Ilmar every two days to clean out /tmp.
>
> -j.
>
Content-Description: clean temporary files
> diff --git a/dolfin/plot/plot.cpp b/dolfin/plot/plot.cpp
> index 288b6bf..2b17d7e 100644
> --- a/dolfin/plot/plot.cpp
> +++ b/dolfin/plot/plot.cpp
> @@ -74,53 +74,63 @@ namespace dolfin
> std::string script_name = secure_tmp_filename("plot.py");
> FILE* script_file = fopen(script_name.c_str(), "w");
>
> - // Write script file
> - fprintf(script_file, "import os, sys\n");
> - fprintf(script_file, "try:\n");
> - fprintf(script_file, " from dolfin import *\n");
> - fprintf(script_file, "except:\n");
> - fprintf(script_file, " print \"Could not import DOLFIN Python module.\"\n");
> - fprintf(script_file, " sys.exit(1)\n\n");
> -
> - fprintf(script_file, "try:\n");
> - if (mesh)
> - {
> - fprintf(script_file, " mesh = Mesh('%s')\n", data_name.c_str());
> - fprintf(script_file, " f = MeshFunction('%s', mesh, '%s')\n\n", type.c_str(), data_name.c_str());
> - }
> - else
> - {
> - fprintf(script_file, " f = %s(r'%s')\n", type.c_str(), data_name.c_str());
> - }
> - fprintf(script_file, " os.remove('%s')\n", data_name.c_str());
> - fprintf(script_file, " os.remove('%s')\n\n", script_name.c_str());
> -
> - fprintf(script_file, "except:\n");
> - fprintf(script_file, " print \"Could not read DOLFIN mesh or function XML file for plotting.\"\n");
> - fprintf(script_file, " sys.exit(1)\n\n");
> -
> - fprintf(script_file, "try:\n");
> - if (mode == "")
> - fprintf(script_file, " plot(f)\n");
> - else
> - fprintf(script_file, " plot(f, mode='%s')\n", mode.c_str());
> - fprintf(script_file, " interactive()\n");
> -
> - fprintf(script_file, "except:\n");
> - fprintf(script_file, " print \"Could not plot DOLFIN mesh or function.\"\n");
> - fprintf(script_file, " sys.exit(1)");
> + fprintf(script_file, "is_mesh = %d\n", !!mesh);
> + fprintf(script_file, "plot_mode = '%s'\n", mode.c_str());
> + fprintf(script_file, "plot_type = '%s'\n", type.c_str());
> + fprintf(script_file, "data_name = '%s'\n", data_name.c_str());
> + fprintf(script_file, "script_name = '%s'\n", script_name.c_str());
> +
> + // We really really want to remove the temporary data files, since they can
> + // be large. To be extra sure, we do it in two places:
> + // - in python, as soon as it is read, in case of crash (this happens a lot,
> + // because of dodgy opengl stacks)
> + // - in c++ if the command fails (maybe because python is not installed)
> + // Deleting the script itself is less vital since it's small. Doing it in
> + // python works, but it seems iffy to delete it while it's running. So we do
> + // that in c++ only.
> +
> +#define _ "\n"
> + const char *script_body =
> + "import os, sys"_
> + ""_
> + "try:"_
> + " what = 'import DOLFIN python module'"_
> + " from dolfin import *"_
> + ""_
> + " what = 'read DOLFIN mesh or function XML file for plotting'"_
> + " if is_mesh:"_
> + " mesh = Mesh(data_name)"_
> + " f = MeshFunction(plot_type, mesh, data_name)"_
> + " else:"_
> + " plot_class = eval(plot_type) # convert class name -> class"_
> + " f = plot_class(data_name)"_
> + " os.remove(data_name)"_
> + ""_
> + " what = 'plot DOLFIN mesh or function'"_
> + " if plot_mode:"_
> + " plot(f, mode=plot_mode)"_
> + " else:"_
> + " plot(f)"_
> + " interactive()"_
> + ""_
> + "except Exception, e:"_
> + " print 'Failed to %s:' % what"_
> + " print ' %s' % str(e)"_
> + " sys.exit(1)"_
> + ;
> +#undef _
> + fprintf(script_file, "%s\n", script_body);
> fclose(script_file);
>
> message("Plotting %s, press q to continue...", type.c_str());
>
> // Run script
> -#ifdef __WIN32__
> - std::string command = "python " + script_name;
> -#else
> std::string command = "python " + script_name;
> -#endif
> - if (system(command.c_str()) != 0)
> + if (system(command.c_str()) != 0) {
> message("Unable to plot (DOLFIN Python module or Viper plotter not available).");
> + remove(data_name.c_str()); // ignore errors, file may be deleted already
> + }
> + remove(script_name.c_str());
> }
>
> template<class T> void plot(T& t, std::string class_name, std::string mode)
> @@ -140,6 +150,7 @@ namespace dolfin
> {
> // Save data to temporary file
> std::string data_name = secure_tmp_filename("plot.xml");
> +
> dolfin_set("output destination", "silent");
> File file(data_name);
> file << f.mesh();
> _______________________________________________
> DOLFIN-dev mailing list
> DOLFIN-dev@xxxxxxxxxx
> http://www.fenics.org/mailman/listinfo/dolfin-dev
Attachment:
signature.asc
Description: Digital signature
References