双缓冲读写与存储文件

时间:2022-09-06 11:55:06
由于试验中需要实时存储数据,格式是.txt格式。文件大了之后(),存储的速度就慢了。
现在存一次,打开关闭文件各一次。
据说双缓冲存储文件可以提高速度,我想咨询下这个该怎么个弄法,谢谢!

6 个解决方案

#1


双缓冲是指除了系统提供的缓冲外,由程序员自建一道缓冲。在图形显示方面有普遍应用。

对于楼主的问题,可以作如下两种考虑:
1、如果内存足够,就使用内存做缓冲区。不必每次都操作文件,将数据存在内存中,经过充分长的时间后再操作一次文件;
2、如果内存不够,可以使用文件做缓冲区。不必每次都操作目标文件,将数据存在多个小文件中,经过充分长的时间后再合并保存在目标文件中。

当然,采用双缓冲时,都要考虑文件数据的一致性和完整性。如果在过程中需要读取文件内容,那么也要通过缓冲(当程序可以控制这种读取时)或及时更新文件(当程序无法控制这种读取时)。

#2


up,学习

#3


up楼上

如果内存足够
可以考虑文件的内存映射
这显然比你频繁打开/关闭文件效率高多了

#4


引用楼主 Tobby0419 的帖子:
由于试验中需要实时存储数据,格式是.txt格式。文件大了之后(),存储的速度就慢了。 
现在存一次,打开关闭文件各一次。 
据说双缓冲存储文件可以提高速度,我想咨询下这个该怎么个弄法,谢谢! 

处理大文件 要考虑用内存映射 
http://blog.csdn.net/yangdelong/archive/2009/01/21/3849375.aspxLZ看看这个

#5


用文件映射 
 第1步:HANDLE CreateFile(
   PCSTR pszFileName,
   DWORD dwDesiredAccess,
   DWORD dwShareMode,
   PSECURITY_ATTRIBUTES psa,
   DWORD dwCreationDisposition,
   DWORD dwFlagsAndAttributes,
   HANDLE hTemplateFile);
创建或打开一个文件内核对象,总是要调用C r e a t e F i l e函数:
第2步:
HANDLE CreateFileMapping(
   HANDLE hFile,
   PSECURITY_ATTRIBUTES psa,
   DWORD fdwProtect,
   DWORD dwMaximumSizeHigh,
   DWORD dwMaximumSizeLow,
   PCTSTR pszName);
调用C r e a t e F i l e函数,就可以将文件映像的物理存储器的位置告诉操作系统。你传递的路径名用于指明支持文件映像的物理存储器在磁盘(或网络或光盘)上的确切位置。

第3步:
PVOID MapViewOfFile(
   HANDLE hFileMappingObject,
   DWORD dwDesiredAccess,
   DWORD dwFileOffsetHigh,
   DWORD dwFileOffsetLow,
   SIZE_T dwNumberOfBytesToMap);
文件数据映射到进程的地址空间

第4步:程序结束,销毁资源
BOOL UnmapViewOfFile(PVOID pvBaseAddress);
从进程的地址空间中撤消文件数据的映像

#6


mark......

#1


双缓冲是指除了系统提供的缓冲外,由程序员自建一道缓冲。在图形显示方面有普遍应用。

对于楼主的问题,可以作如下两种考虑:
1、如果内存足够,就使用内存做缓冲区。不必每次都操作文件,将数据存在内存中,经过充分长的时间后再操作一次文件;
2、如果内存不够,可以使用文件做缓冲区。不必每次都操作目标文件,将数据存在多个小文件中,经过充分长的时间后再合并保存在目标文件中。

当然,采用双缓冲时,都要考虑文件数据的一致性和完整性。如果在过程中需要读取文件内容,那么也要通过缓冲(当程序可以控制这种读取时)或及时更新文件(当程序无法控制这种读取时)。

#2


up,学习

#3


up楼上

如果内存足够
可以考虑文件的内存映射
这显然比你频繁打开/关闭文件效率高多了

#4


引用楼主 Tobby0419 的帖子:
由于试验中需要实时存储数据,格式是.txt格式。文件大了之后(),存储的速度就慢了。 
现在存一次,打开关闭文件各一次。 
据说双缓冲存储文件可以提高速度,我想咨询下这个该怎么个弄法,谢谢! 

处理大文件 要考虑用内存映射 
http://blog.csdn.net/yangdelong/archive/2009/01/21/3849375.aspxLZ看看这个

#5


用文件映射 
 第1步:HANDLE CreateFile(
   PCSTR pszFileName,
   DWORD dwDesiredAccess,
   DWORD dwShareMode,
   PSECURITY_ATTRIBUTES psa,
   DWORD dwCreationDisposition,
   DWORD dwFlagsAndAttributes,
   HANDLE hTemplateFile);
创建或打开一个文件内核对象,总是要调用C r e a t e F i l e函数:
第2步:
HANDLE CreateFileMapping(
   HANDLE hFile,
   PSECURITY_ATTRIBUTES psa,
   DWORD fdwProtect,
   DWORD dwMaximumSizeHigh,
   DWORD dwMaximumSizeLow,
   PCTSTR pszName);
调用C r e a t e F i l e函数,就可以将文件映像的物理存储器的位置告诉操作系统。你传递的路径名用于指明支持文件映像的物理存储器在磁盘(或网络或光盘)上的确切位置。

第3步:
PVOID MapViewOfFile(
   HANDLE hFileMappingObject,
   DWORD dwDesiredAccess,
   DWORD dwFileOffsetHigh,
   DWORD dwFileOffsetLow,
   SIZE_T dwNumberOfBytesToMap);
文件数据映射到进程的地址空间

第4步:程序结束,销毁资源
BOOL UnmapViewOfFile(PVOID pvBaseAddress);
从进程的地址空间中撤消文件数据的映像

#6


mark......