谢谢~
13 个解决方案
#1
使用一个新流,现将要添加在头部的数据添加,然后再源文件流添加,不就可以了,
#2
如果文件比较大,可以分段读分段追加
#3
写到文件头上回节省时间么?可能是我孤陋寡闻了,哈
我向一个250M大小的文件写1M数据,耗时基本上在15ms到31ms,这个应该不怎么影响性能吧?
我向一个250M大小的文件写1M数据,耗时基本上在15ms到31ms,这个应该不怎么影响性能吧?
#4
FStream := TFileStream.Create('A.dat', fmOpenReadWrite);
try
FStream.Seek(0, soEnd);
FStream.Write(FTick, SizeOf(Cardinal));
FStream.Write(Temp, SizeOf(TBudded)); //TBudded里面有1M数据
finally
FStream.Free;
end;
写10M数据基本在130ms左右,
#5
我的意思是:
假如有A(500MB),B(1KB)两个文件,我想要它们合并成一个文件,并且让B在前面,A紧随其后。
有什么办法(考虑的时间问题,我只能做到让A在前面,B紧随其后)?
假如有A(500MB),B(1KB)两个文件,我想要它们合并成一个文件,并且让B在前面,A紧随其后。
有什么办法(考虑的时间问题,我只能做到让A在前面,B紧随其后)?
#6
参考budded的代码,注意seek的用法。
#7
budded的不也是seek到了尾部吗?
#8
是的,那段代码的作用就是向A文件追加数据,速度应该不慢。
另外,操作大文件可以采用内核对象,比如CreateFileMapping,MapViewOfFile等函数,速度超快!
另外,操作大文件可以采用内核对象,比如CreateFileMapping,MapViewOfFile等函数,速度超快!
#9
如果经常需要插入数据,那就是设计有问题了。
#10
...(考虑到源文件很大,将源文件追加到数据末尾需要花费很长时间,我不想这样)...
-------
这个观点是不对的,对于向文件追加数据来说,“追加到末尾”是所有方式中效率最高的一种,
因为不需要“搬动”任何已有的数据。
-------
这个观点是不对的,对于向文件追加数据来说,“追加到末尾”是所有方式中效率最高的一种,
因为不需要“搬动”任何已有的数据。
#11
...(考虑到源文件很大,将源文件追加到数据末尾需要花费很长时间,我不想这样)...
-------
这个观点是不对的,对于向文件追加数据来说,“追加到末尾”是所有方式中效率最高的一种,
因为不需要“搬动”任何已有的数据。
-------
如果要把一个200MB的文件追加到末尾总得需要半分钟吧。我的目的只是将几KB的数据加到大文件的头部。不知道有没有不用“搬动”数据的方法?
-------
这个观点是不对的,对于向文件追加数据来说,“追加到末尾”是所有方式中效率最高的一种,
因为不需要“搬动”任何已有的数据。
-------
如果要把一个200MB的文件追加到末尾总得需要半分钟吧。我的目的只是将几KB的数据加到大文件的头部。不知道有没有不用“搬动”数据的方法?
#12
如果要把一个200MB的文件追加到末尾总得需要半分钟吧。我的目的只是将几KB的数据加到大文件的头部。不知道有没有不用“搬动”数据的方法?
===============================================
往文件头插入数据而不用“搬动”数据的高效办法是不存在。
文件的数据类型本质是"流",与线性表类似。在文件尾添加或删除数据是最容易的,是不用“搬动”数据。而在文件中或文件头插入或删除数据都将"搬动"插入或删除位置处之后的全部或部分数据。
===============================================
往文件头插入数据而不用“搬动”数据的高效办法是不存在。
文件的数据类型本质是"流",与线性表类似。在文件尾添加或删除数据是最容易的,是不用“搬动”数据。而在文件中或文件头插入或删除数据都将"搬动"插入或删除位置处之后的全部或部分数据。
#13
谢谢~看来我只能搬动数据了。。
#1
使用一个新流,现将要添加在头部的数据添加,然后再源文件流添加,不就可以了,
#2
如果文件比较大,可以分段读分段追加
#3
写到文件头上回节省时间么?可能是我孤陋寡闻了,哈
我向一个250M大小的文件写1M数据,耗时基本上在15ms到31ms,这个应该不怎么影响性能吧?
我向一个250M大小的文件写1M数据,耗时基本上在15ms到31ms,这个应该不怎么影响性能吧?
#4
FStream := TFileStream.Create('A.dat', fmOpenReadWrite);
try
FStream.Seek(0, soEnd);
FStream.Write(FTick, SizeOf(Cardinal));
FStream.Write(Temp, SizeOf(TBudded)); //TBudded里面有1M数据
finally
FStream.Free;
end;
写10M数据基本在130ms左右,
#5
我的意思是:
假如有A(500MB),B(1KB)两个文件,我想要它们合并成一个文件,并且让B在前面,A紧随其后。
有什么办法(考虑的时间问题,我只能做到让A在前面,B紧随其后)?
假如有A(500MB),B(1KB)两个文件,我想要它们合并成一个文件,并且让B在前面,A紧随其后。
有什么办法(考虑的时间问题,我只能做到让A在前面,B紧随其后)?
#6
参考budded的代码,注意seek的用法。
#7
budded的不也是seek到了尾部吗?
#8
是的,那段代码的作用就是向A文件追加数据,速度应该不慢。
另外,操作大文件可以采用内核对象,比如CreateFileMapping,MapViewOfFile等函数,速度超快!
另外,操作大文件可以采用内核对象,比如CreateFileMapping,MapViewOfFile等函数,速度超快!
#9
如果经常需要插入数据,那就是设计有问题了。
#10
...(考虑到源文件很大,将源文件追加到数据末尾需要花费很长时间,我不想这样)...
-------
这个观点是不对的,对于向文件追加数据来说,“追加到末尾”是所有方式中效率最高的一种,
因为不需要“搬动”任何已有的数据。
-------
这个观点是不对的,对于向文件追加数据来说,“追加到末尾”是所有方式中效率最高的一种,
因为不需要“搬动”任何已有的数据。
#11
...(考虑到源文件很大,将源文件追加到数据末尾需要花费很长时间,我不想这样)...
-------
这个观点是不对的,对于向文件追加数据来说,“追加到末尾”是所有方式中效率最高的一种,
因为不需要“搬动”任何已有的数据。
-------
如果要把一个200MB的文件追加到末尾总得需要半分钟吧。我的目的只是将几KB的数据加到大文件的头部。不知道有没有不用“搬动”数据的方法?
-------
这个观点是不对的,对于向文件追加数据来说,“追加到末尾”是所有方式中效率最高的一种,
因为不需要“搬动”任何已有的数据。
-------
如果要把一个200MB的文件追加到末尾总得需要半分钟吧。我的目的只是将几KB的数据加到大文件的头部。不知道有没有不用“搬动”数据的方法?
#12
如果要把一个200MB的文件追加到末尾总得需要半分钟吧。我的目的只是将几KB的数据加到大文件的头部。不知道有没有不用“搬动”数据的方法?
===============================================
往文件头插入数据而不用“搬动”数据的高效办法是不存在。
文件的数据类型本质是"流",与线性表类似。在文件尾添加或删除数据是最容易的,是不用“搬动”数据。而在文件中或文件头插入或删除数据都将"搬动"插入或删除位置处之后的全部或部分数据。
===============================================
往文件头插入数据而不用“搬动”数据的高效办法是不存在。
文件的数据类型本质是"流",与线性表类似。在文件尾添加或删除数据是最容易的,是不用“搬动”数据。而在文件中或文件头插入或删除数据都将"搬动"插入或删除位置处之后的全部或部分数据。
#13
谢谢~看来我只能搬动数据了。。