C++ c++;重复的刷新需要很长时间

C++ c++;重复的刷新需要很长时间,c++,raspberry-pi,C++,Raspberry Pi,在我的Raspberry Pi 3B程序中,我正在以非顺序模式编写一个二进制文件。 所以我必须在文件中的特定位置写一个块 在我的循环中,我按顺序调用:memcpy复制我需要在缓冲区中写入文件的块,fseek指向这个块应该写入的位置,fwrite写入块和fflush 在一些循环之后,函数fwrite或fflush被卡住,需要很长时间才能完成,即使所有调用的块大小几乎相同 我多次调用的函数: static void writeChunk(FILE* total, unsigned char *dat

在我的Raspberry Pi 3B程序中,我正在以非顺序模式编写一个二进制文件。 所以我必须在文件中的特定位置写一个块

在我的循环中,我按顺序调用:memcpy复制我需要在缓冲区中写入文件的块,fseek指向这个块应该写入的位置,fwrite写入块和fflush

在一些循环之后,函数fwrite或fflush被卡住,需要很长时间才能完成,即使所有调用的块大小几乎相同

我多次调用的函数:

static void writeChunk(FILE* total, unsigned char *data, T_Chunk* chk, int HEIGHT, int totalStride, int seekStride){

    char* buffer = new char[chk->stride];
    for(int row = 0; row < HEIGHT; ++row){
        auto start = chrono::steady_clock::now();

        memcpy( buffer, data + (row*chk->stride), chk->stride);


        //total.seekp((row * totalStride) + seekStride, total.beg);

        start = chrono::steady_clock::now();
        fseek(total, (row * totalStride) + seekStride, SEEK_SET);

        auto end = chrono::steady_clock::now();
        if(chrono::duration_cast<chrono::microseconds>(end - start).count() > 150)
            cout << "Elapsed time in microseconds fseek : " 
            << chrono::duration_cast<chrono::microseconds>(end - start).count()
            << endl;
        //total.write(buffer, chk->stride);


        start = chrono::steady_clock::now();
        fwrite(buffer, 1, chk->stride, total);



        end = chrono::steady_clock::now();
        if(chrono::duration_cast<chrono::microseconds>(end - start).count() > 150)
            cout << "Elapsed time in microseconds fwrite ( " << chk->stride << " ): " 
            << chrono::duration_cast<chrono::microseconds>(end - start).count()
            << endl;


        start = chrono::steady_clock::now();
        fflush(total);



        end = chrono::steady_clock::now();
        if(chrono::duration_cast<chrono::microseconds>(end - start).count() > 150)
            cout << "Elapsed time in microseconds fflush ( " << chk->stride << " ): " 
            << chrono::duration_cast<chrono::microseconds>(end - start).count()
            << endl;



        //total.flush();

    }
    free(buffer);
    free(data);

}
为什么所有电话的时间都不一样

为什么在一些调用之后,它会像从日志中看到的5432436或175095微秒那样持续这么长时间

这个问题会影响另一个试图从不同文件读取的线程,所以我猜I/O缓冲区有问题

问题是在我的代码上还是在我使用的硬件上

如何改进代码?我真的不需要速度,但它不应该锁定其他I/O进程


谢谢。

我猜缓存用于快速写入。您真的需要
fflush()
?是否有另一个进程同时读取文件?Fflush写入磁盘,但磁盘也有缓存。一旦它满了,就可以获得磁盘速度。我使用fflush来避免使用我认为是问题所在的所有I/O缓冲区。还有另一个进程只读取一个不同的文件。因此,问题可能是磁盘缓存。该磁盘是一张SD卡,是三星EVO Plus,写入速度为20Mb/s,文件大小约为260Mb,因此需要的时间不超过15秒,但需要的时间会更长。有没有办法管理磁盘缓冲区或防止磁盘缓冲区被填满?我猜缓存是用于快速写入的。您真的需要
fflush()
?是否有另一个进程同时读取文件?Fflush写入磁盘,但磁盘也有缓存。一旦它满了,就可以获得磁盘速度。我使用fflush来避免使用我认为是问题所在的所有I/O缓冲区。还有另一个进程只读取一个不同的文件。因此,问题可能是磁盘缓存。该磁盘是一张SD卡,是三星EVO Plus,写入速度为20Mb/s,文件大小约为260Mb,因此需要的时间不超过15秒,但需要的时间会更长。有没有办法管理磁盘缓冲区或防止磁盘缓冲区被填满?
Elapsed time in microseconds fwrite ( 7552 ): 166
Elapsed time in microseconds fwrite ( 7296 ): 207
Elapsed time in microseconds fwrite ( 7488 ): 156
Elapsed time in microseconds fwrite ( 7680 ): 162
Elapsed time in microseconds fwrite ( 7616 ): 164
Elapsed time in microseconds fwrite ( 7488 ): 158
Elapsed time in microseconds fwrite ( 7680 ): 160
Elapsed time in microseconds fwrite ( 7616 ): 151
Elapsed time in microseconds fwrite ( 7296 ): 195
Elapsed time in microseconds fwrite ( 7296 ): 175
Elapsed time in microseconds fwrite ( 7296 ): 179
Elapsed time in microseconds fwrite ( 7552 ): 23034
Elapsed time in microseconds fwrite ( 7552 ): 27514
Elapsed time in microseconds fflush ( 7680 ): 34438
Elapsed time in microseconds fwrite ( 7680 ): 27492
Elapsed time in microseconds fwrite ( 7680 ): 26612
Elapsed time in microseconds fwrite ( 7616 ): 27856
Elapsed time in microseconds fflush ( 7616 ): 27502
Elapsed time in microseconds fwrite ( 7616 ): 27366
Elapsed time in microseconds fwrite ( 7616 ): 27444
Elapsed time in microseconds fflush ( 7616 ): 27881
Elapsed time in microseconds fflush ( 7616 ): 27593
Elapsed time in microseconds fflush ( 7616 ): 27417
Elapsed time in microseconds fflush ( 7552 ): 27582
Elapsed time in microseconds fwrite ( 7552 ): 27374
Elapsed time in microseconds fwrite ( 7552 ): 27517
Elapsed time in microseconds fwrite ( 7552 ): 24657
Elapsed time in microseconds fwrite ( 7488 ): 199
Elapsed time in microseconds fflush ( 7488 ): 27734
Elapsed time in microseconds fwrite ( 7488 ): 24747
Elapsed time in microseconds fflush ( 7488 ): 24714
Elapsed time in microseconds fwrite ( 7488 ): 187
Elapsed time in microseconds fwrite ( 7360 ): 228
Elapsed time in microseconds fflush ( 7360 ): 27808
Elapsed time in microseconds fflush ( 7360 ): 24886
Elapsed time in microseconds fwrite ( 7360 ): 24601
Elapsed time in microseconds fwrite ( 7680 ): 203
Elapsed time in microseconds fwrite ( 7680 ): 196
Elapsed time in microseconds fwrite ( 7680 ): 28047
Elapsed time in microseconds fflush ( 7680 ): 24879
Elapsed time in microseconds fflush ( 7680 ): 24948
Elapsed time in microseconds fwrite ( 7360 ): 202
Elapsed time in microseconds fflush ( 7360 ): 26000
Elapsed time in microseconds fwrite ( 7616 ): 24685
Elapsed time in microseconds fwrite ( 7616 ): 38157
Elapsed time in microseconds fwrite ( 7616 ): 38434
Elapsed time in microseconds fflush ( 7616 ): 38301
Elapsed time in microseconds fwrite ( 7616 ): 38315
Elapsed time in microseconds fwrite ( 7488 ): 29295
Elapsed time in microseconds fflush ( 7488 ): 38358
Elapsed time in microseconds fwrite ( 7488 ): 38366
Elapsed time in microseconds fwrite ( 7488 ): 36493
Elapsed time in microseconds fflush ( 7488 ): 36495
Elapsed time in microseconds fwrite ( 7488 ): **5432436**
Elapsed time in microseconds fwrite ( 7488 ): 982
Elapsed time in microseconds fflush ( 7488 ): **175095**
Elapsed time in microseconds fwrite ( 7552 ): 154
Elapsed time in microseconds fflush ( 7616 ): 224
Elapsed time in microseconds fwrite ( 7424 ): 279
Elapsed time in microseconds fflush ( 7488 ): 25078
Elapsed time in microseconds fwrite ( 7488 ): 27502
Elapsed time in microseconds fwrite ( 7488 ): 27483
Elapsed time in microseconds fwrite ( 7360 ): 28146
Elapsed time in microseconds fwrite ( 7360 ): 27558
Elapsed time in microseconds fflush ( 7360 ): 27403
Elapsed time in microseconds fwrite ( 7616 ): 27819
Elapsed time in microseconds fflush ( 7616 ): 27480