gpt4 book ai didi

c++ - 有没有比fseek和fwrite更快的写入方法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:24:32 24 4
gpt4 key购买 nike

我有 1GB 的二进制文件,基本上包含相同类型值的 3D 立方体。使用 fseek 和 fwrite 以不同的顺序([x,y,z] 或 [z x, y])保存这种立方体会花费大量时间。但是其中一个软件包比我的程序快得多。有什么方法可以使文件写入速度比使用 fseek/fwrite 更快吗?

最佳答案

你不应该在文件 io 操作的内部循环中使用 fseek。为了使写入功能更快,它们会缓存写入。如果你到处寻找,你就会不断地消耗缓存。

在内存中执行所有转换 - 例如在内存中旋转立方体,然后在几个连续的 fwrite 调用中写入文件。

如果您不能在内存中完全转换您的数据,那么在内存中一次组装您的立方体一个平面并写出每个平面。

@编辑:

在您的情况下,您根本不想使用 fseek。一个也没有。

做这样的事情:

void writeCubeZYX( int* cubeXYZ, int sizeOfCubeXYZ, FILE* file )
{
int* cubeZYX = malloc( sizeOfCubeXYZ );

// all that monkey business you're doing with fseek is done inside this
// function copying memory to memory. No file IO operations in here.
transformCubeXYZ_to_ZYX( cubeXYZ, cubeZYX, sizeOfCubeXYZ );

// one big fat very fast fwrite. Optimal use of file io cache.
fwrite( file, cubeZYX, 1, sizeOfCubeXYZ );

free( cubeZYX ); // quiet pedantry.
}

@edit2:

好吧,假设你不能在内存中全部转换然后在平面中转换它并一次写出一个平面 - 按文件顺序 - 即没有 fseeks。

假设一个 [XYZ] 立方体在内存中作为一系列 Z [XY] 矩阵布置。那就是你的立方体的 [XY] 平面在内存中是连续的。你想写成 [ZYX]。所以在文件中你要写出一系列 X [ZY] 矩阵。每个 [ZY] 在文件中都是连续的。

所以你做这样的事情:

void writeCubeZYX( int* cubeXYZ, int x, int y, int z, FILE* file )
{
int sizeOfPlaneZY = sizeof( int ) * y * z;
int* planeZY = malloc( sizeOfPlaneZY );

for ( int i = 0; i < X; i++ )
{
// all that monkey business you're doing with fseek is done inside this
// function extracting one ZY plane at a time. No file IO operations in here.
extractZYPlane_form_CubeXYZ( cubeXYZ, planeZY, i );

// in X big fat very fast fwrites. Near optimal use of file io cache.
fwrite( file, planeZY, 1, sizeOfPlaneZY );
}

free( planeZY ); // quiet pedantry.
}

关于c++ - 有没有比fseek和fwrite更快的写入方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11875184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com