处理大数据,读写大于4GB的文件,不要告诉我用内存映射的方法;

a2901153 2012-08-06 02:22:00
现在我要处理一组数据,总大小估计几十个G;现在用的是FILE *rFile,fseek,ftell,fwrite但是当数据量到4G的时候,就再也写不进去了。不想用内存映射的方法,因为之后的已经全写完了,而且不知道内存映射之后文件的定位以及读写方法,能不能在现有的方法上改,对了,我用的是32位xp系统,vc6.0
...全文
3336 47 打赏 收藏 转发到动态 举报
写回复
用AI写文章
47 条回复
切换为时间正序
请发表友善的回复…
发表回复
a2901153 2012-08-15
  • 打赏
  • 举报
回复
xie xie da jia de re xin bang zhu ;tebie shi zi you yu .ling wai tong zhi da jia ,wo yi jing jiao xie tou xiang le ,yong le wen jian ying she de fang fa ,yan jiu le 3 tian zhongyu nong chu lai le ;zai ci gan xie da jia
ao929929fei 2012-08-13
  • 打赏
  • 举报
回复
可以搞多层目录结构,类似于文件操纵的方式
lixiaoya529 2012-08-12
  • 打赏
  • 举报
回复
分成几个小文件是最好的方法了。
hsc456 2012-08-12
  • 打赏
  • 举报
回复
我认为不需要改程序, 要格式化硬盘为 NTFS, FAT32 不支持大于4G的文件, 你如何写得进去???

taodm 2012-08-12
  • 打赏
  • 举报
回复
珍惜生命,远离VC6这个垃圾货。新的编译器都已经把fread/fwrite函数族更新到64位了

[Quote=引用 5 楼 的回复:]
引用 2 楼 的回复:
_fseeki64 _ftelli64 之类的函数操作


VC6.0无_fseeki64 _ftelli64函数
[/Quote]
庄鱼 2012-08-12
  • 打赏
  • 举报
回复

class BigFileSpace{
struct DataDef{
int Num;
__int64 Size,Pos,Used;
TStream *Stm;
int Active;
struct BuffDef{
int Id;
char Name[256];
int Len;
TStream *stm;} *Dat[MAXNUM];} DataSpace;
public:
BigFileSpace(){DataSpace.Num=0;DataSpace.Dat=0;}
~BigFileSpace();
int Add(UnicodeString Filename,int Size);
TStream* Seek(__int64 At,int offset);
int Write(void* buf,int);
int Read(void* buf,int);
...
};
~BigFileSpace::BigFileSpace()
{
if(DataSpace.Dat)
for(int i=0;i<DataSpace.Num;++i)
if(DataSpace.Dat[i]->stm){
delete DataSpace.Dat[i]->stm; DataSpace.Dat[i]->stm=0;}
DataSpace.Dat=0;
}
int Add(UnicodeString File,int Size)
{
TStream *stm=0;
if(FileExists(File))
stm = new TFileStream(File,fmOpenReadWrite);
else{
stm = new TFileStream(File,fmCreate);
stm->Size = Size;
stm->position=0;}
DataSpace.Dat[DataSpace.Num]->stm = stm;
strcpy(DataSpace.Dat[DataSpace.Num]->Name,File.c_str());
DataSpace.Dat[DataSpace.Num]->Size = Size;
DataSpace.Num++;
DataSpace.Id = DataSpace.Num;
return 0;
}
int Read(void *Buf,int N)
{
if(Stm->Position+N<Stm->Size)
Stm->Read(buf,N);
else{
int n = Stm->Size-Stm->Position;
Stm->Read(buf,n);
Active++;
Stm = DataSpace.Dat[Active]->Stm;
Stm->Position = 0;
Stm->Read(buf+n,N-n);}
Pos += N;
return 0;
}
TStream* Seek(__int64 At,int Offset)
{
__int64 at=At;
switch(Offset){
case BEGIN: for(int i=0;i<DataSpace.Num;++i){
if(at <DataSpace.Dat[i]->Size){
Pos = At;
DataSpace.Dat[i]->stm->Position = at;
Active = i;
return Stm = DataSpace.Dat[i]->stm;}
at -= DataSpace.Dat[i].Size;}
break;
case CURRENT:
...
}
没环境,大致如此,自己完善吧
kingdom_0 2012-08-09
  • 打赏
  • 举报
回复
分块存储
  • 打赏
  • 举报
回复
现在不是流行那个什么mapreduce吗?好像有大数据文件的解决方案。
lz去研究研究共享一下啊
lulu13681 2012-08-09
  • 打赏
  • 举报
回复
弱弱的问一句,不能用文件映射吗?
fthislife 2012-08-09
  • 打赏
  • 举报
回复
用文件内存映射毫不费劲,你可以封装成一个类啊,接口写成和你调用的fseek,ftell,fwrite一样不就行了,这样不会影响你其他地方,不管是文件分块处理还是整个的处理也好,并且以后还可以重用在别的程序中。
maptrix 2012-08-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

用windows api,反正_fseeki64 也不是标准c的
[/Quote]

+1
Conry 2012-08-08
  • 打赏
  • 举报
回复
一直写应该能把硬盘写满,只是fseek的参数是32位,访问不到大于4g以后的位置,所以随机访问不行
vc6的话就用api吧,createfile,setfilepointer等来处理吧
sukaru 2012-08-08
  • 打赏
  • 举报
回复
用c++标准库函数肯定不行。
haunying3 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 的回复:]

引用 19 楼 的回复:
引用 12 楼 的回复:
引用 7 楼 的回复:
FAT最大支持4G文件,换什么函数也不行,更改分区类型为NTFS.


什么意思?是吧fat32换成ntfs后就可以了吗?程序不用改??


对头,程序不用改,该怎么写还怎么写,绝对超过4G,我曾经遇到过这个问题。



不行啊,我的本来就是ntfs的盘,写不上4G啊
[/Quote]
用c++标准库函数,这样行吗?
sl51314240 2012-08-08
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 的回复:]

用ReadFile/WriteFile/SetFilePointer。SetFilePointer可以支持64位地址。
不過ReadFile/WriteFile一次只能讀/寫 4G以內的內容。
[/Quote]

每调一次API读写4G??你真疯狂……
就算要连续读4G,我也会分块,每块10MB,循环个100多次……
zxfishhack 2012-08-08
  • 打赏
  • 举报
回复
用ReadFile/WriteFile/SetFilePointer。SetFilePointer可以支持64位地址。
不過ReadFile/WriteFile一次只能讀/寫 4G以內的內容。
Defonds 2012-08-07
  • 打赏
  • 举报
回复
分块吧
种菜的 2012-08-07
  • 打赏
  • 举报
回复
一个文件80G,应该换存储策略了,3楼说的方法可行。
  • 打赏
  • 举报
回复
CreateFile

WriteFile 都有overlapped那个参数,里头可以设置偏移啊!
a2901153 2012-08-07
  • 打赏
  • 举报
回复
用了CreatFile到是可以写上10G,但是我的数据至少有80G,写不上就白干了啊
加载更多回复(26)

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧