
Hi, Am 15.04.21 um 11:27 schrieb ☂Josh Chia (謝任中):
That would work but may not be the most efficient in all cases. On many
systems, /tmp is a tmpfs, which being memory-backed is more efficient than a file on a physical disk or network, so writing to /tmp has performance advantages.
This isn't necessarily relevant in the case the OP describes. In the case where the target directory is also on tmpfs, writing there directly is just as fast as writing to /tmp first. In the case where the target directory is on a slower medium it is not more efficient to write to /tmp first, because you will still have the performance penalty once you copy from /tmp to the target directory. The latter case might be slower if you first write something to the file and later overwrite parts of it with other content or if you decide that you don't need the file at all and just delete it instead of copying it. But you can prevent even those performance penalties by not calling fsync (or close) on the open file before the file contains exactly the data you ultimately want. That way the written content will not actually be written to the medium before fsync is called and you get pretty much the same performance as writing on tmpfs. Though controlling when fsync is called might be tricky if the file is not produced by your own code. I'm also not sure if Haskell calls fsync implicitly in some cases other than closing the file descriptor. Regards Sven