Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the ideal memory block size to use when copying?

I am currently using 100 megabytes per memory block to copy large files.

Is there a "good" amount that people normally use?

Edit

Thanks for all the great responses.

I'm still quite new to these concepts so I'll try to understand a lot of the ones that have been said (e.g. write back cache). I keep learning new things :)

like image 332
Zac Blazic Avatar asked Mar 26 '11 21:03

Zac Blazic


People also ask

What is the size of a memory block?

The file register RAM block, which includes the SRFs and GPRs, tends to increase in size with the program memory size and chip complexity, and ranges from 16 to 4096 bytes in the 8-bit PICs.

How do I choose a block size?

Usually, it depends on the input data. If you want to maximize throughput for a very large input file, using very large blocks (may be 128MB or even 256MB) is best. But on the other hand for smaller files, using a smaller block size is better. Most obviously, a file will have fewer blocks if the block size is larger.

What is the most common block size for a data block?

“The default block size on volumes is 4K.

What's a common file system block size?

The device block size is usually 512 bytes while the filesystem block size is often 4096 bytes.


2 Answers

A block between 4096 and 32KB is the typical choice. Using 100MB is counter-productive. You are occupying RAM with the buffer that can be put to much better use as the file system writeback cache.

Copying files is very fast when the file fits completely in the cache, the WriteFile() call is a simple memory-to-memory copy. The cache manager then lazily writes it out to the disk. But when there's no more room in the cache, the copy speed drops off a cliff when WriteFile() has to wait for space to be made available. It now goes at disk write speeds.

like image 145
Hans Passant Avatar answered Nov 10 '22 01:11

Hans Passant


I would recommend you to benchmark this, and remember to include much smaller block sizes. In my own tests on this, I got quite counterintuitive results.

When reading and writing from the hard drive, all (power of two) block sizes between 512 byte and 512 kB gave the same speed. Increasing the block size from 512 kB to 1 MB reduced the copying speed to about 60%. Increasing the block size further increased the speed again, but never all the way back to the speed of using small blocks.

When all the copied data was in the cache memory, the (much faster) copying speed improved with increasing block sizes, flattening out around reaching 32 kB blocks, and then suddenly dropped to about half the previous speed when going from 256 kB to 512 kB blocks, never to return to the previous speeds.

After this test, I dropped read/write block sizes in several of my programs from around 1 MB to 32 kB.

like image 39
Baffe Boyois Avatar answered Nov 10 '22 01:11

Baffe Boyois