I'm currently writing a C++ program that needs to write a large amount of data in a file (typically around 5Gb), by writing buffers sequentially. In this example, I'm writing buffers of 400Mb into a std::ofstream. My disk is a SSD and almost empty. After 4 buffers, the writing performance decreases. Does someone know why and if that can be avoided?
Here is my code:
#include <iostream>
#include <iomanip>
#include <fstream>
#include <chrono>
int main()
{
unsigned int bufferSize = 4e8; //400Mb
unsigned char* buffer = new unsigned char[bufferSize];
for (unsigned int i = 0; i < bufferSize; i++)
buffer[i] = (unsigned char) i % 256; // just "randomly" writing the buffer
std::ofstream ofs("test.bin");
std::chrono::steady_clock::time_point start_time;
std::chrono::steady_clock::time_point stop_time;
std::chrono::duration<double> duration;
for (int i = 1; i <= 10; i++)
{
start_time = std::chrono::steady_clock::now();
ofs.write((char*) buffer, bufferSize);
stop_time = std::chrono::steady_clock::now();
duration = stop_time - start_time;
std::cout << "i = " << i << ", time spent copying the buffer = " << std::chrono::duration_cast<std::chrono::nanoseconds>(duration).count() / 1e6 << "ms" << std::endl;
}
ofs.close();
delete[] buffer;
return 0;
}
And here is what I get when running it:
nirupamix@machine:~/$ ./main.out
i = 1, time spent copying the buffer = 166.267ms
i = 2, time spent copying the buffer = 170.698ms
i = 3, time spent copying the buffer = 177.484ms
i = 4, time spent copying the buffer = 210.693ms
i = 5, time spent copying the buffer = 475.933ms
i = 6, time spent copying the buffer = 793.295ms
i = 7, time spent copying the buffer = 822.195ms
i = 8, time spent copying the buffer = 828.539ms
i = 9, time spent copying the buffer = 850.651ms
i = 10, time spent copying the buffer = 794.542ms
There are several problems that can occur when writing large amount of data to a SSD
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.