|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2004-08-31 19:07 UTC] info at pion dot xs4all dot nl
Description:
------------
If you copy a file of N megabytes (N in the order of a few
hundred megs) your proces will use the same order of ammount
of memory (or less if the system doesn't have that much).
This is probably because the file is compleetly memory mapped
and than the content is written to an other file.
Probably it will be better to use the behavior of the unix
"cp" command which reads 4k and than writes the 4k.
In this way "cp" is almost a factor two faster than php
and has less impact on the system performance.
Reproduce code:
---------------
<?php
#
# This assumes that there excist a big
# file "/tmp/file_512m" which has 512mb
# of data and that there is enough space
# in "/tmp".
#
copy ("/tmp/file_512m", "/tmp/target")
?>
Expected result:
----------------
The unix "cp" needed 1 minut 8 seconds to copy
the file and php used 2 and 18 seconds on my desktop
system with 512mb.
Actual result:
--------------
They should be in the same order
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Mon Nov 24 09:00:02 2025 UTC |
I have a small patch for the 5.1.0-dev which solves the problem but: This patch says a normal copy should be used for files bigger then 32 MB. But this is an rather arbitrary value choosen by me. Here follows the patch: -diff -Naur org/php5-200409011830/main/streams/streams.c php5-200409011830/main/streams/streams.c --- org/php5-200409011830/main/streams/streams.c 2004-08-31 14:30:59.000000000 +0200 +++ php5-200409011830/main/streams/streams.c 2004-09-01 22:06:11.579747624 +0200 @@ -1276,7 +1276,12 @@ } } - if (php_stream_mmap_possible(src)) { + /* + ** We shouldn't use memory mapping on big files just for copying them. + ** It's not an efficient sollution for the vm. So for files above + ** 32mb (32*1024^2=33554432) we want a normal copy + */ + if ((php_stream_mmap_possible(src)) && (ssbuf.sb.st_size < 33554432)) { char *p; size_t mapped; ----------------------