大型obj文件切割问题

从来不作 2015-06-19 02:12:48
假设我有一个obj文件,十几个G,现在想显示它(或者说漫游)。由于文件太大,不能一次导入内存。我的想法是将obj文件切割成多个小文件,请问该如何做呢?
...全文
502 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
辰岡墨竹 2015-06-20
  • 打赏
  • 举报
回复
引用 3 楼 banshichiqinglangzi 的回复:
[quote=引用 2 楼 qwqwqw408 的回复:] 根本不需要切割,每次根据需要读取文件不同部分即可。你切割成小文件也不能一次全部导入内存,还不是要一个个看。。
这涉及到一个观察视野。切割成多个小文件,我可以这么弄:如果在视野范围内,就加载相应的文件,如果不在,就不加载。如果出了视野范围,还要卸载相应的文件。这样的话,文件不用全部载入内存,我也可以实现对文件的漫游。像你说的,每次读取文件不同部分,那岂不是即时读取,岂不是很慢。所以我才想把文件分割成多个小块。[/quote] 内存映射文件可以解决你的问题,而且速度比直接读文件要快,不需要分割文件,直接把文件内容的一部分映射到内存里(就是你说的视野一样的东西)。 当然如果你是为了便于内存管理,分割也可以。 不过问题的重点其实是你得知道那个文件是啥格式的,如果知道,分割并不难,读取内容,构造新的子文件格式,写进去就可以了。
从来不作 2015-06-20
  • 打赏
  • 举报
回复
引用 4 楼 Bokutake 的回复:
[quote=引用 3 楼 banshichiqinglangzi 的回复:] [quote=引用 2 楼 qwqwqw408 的回复:] 根本不需要切割,每次根据需要读取文件不同部分即可。你切割成小文件也不能一次全部导入内存,还不是要一个个看。。
这涉及到一个观察视野。切割成多个小文件,我可以这么弄:如果在视野范围内,就加载相应的文件,如果不在,就不加载。如果出了视野范围,还要卸载相应的文件。这样的话,文件不用全部载入内存,我也可以实现对文件的漫游。像你说的,每次读取文件不同部分,那岂不是即时读取,岂不是很慢。所以我才想把文件分割成多个小块。[/quote] 内存映射文件可以解决你的问题,而且速度比直接读文件要快,不需要分割文件,直接把文件内容的一部分映射到内存里(就是你说的视野一样的东西)。 当然如果你是为了便于内存管理,分割也可以。 不过问题的重点其实是你得知道那个文件是啥格式的,如果知道,分割并不难,读取内容,构造新的子文件格式,写进去就可以了。[/quote] 讲的很好
从来不作 2015-06-19
  • 打赏
  • 举报
回复
引用 2 楼 qwqwqw408 的回复:
根本不需要切割,每次根据需要读取文件不同部分即可。你切割成小文件也不能一次全部导入内存,还不是要一个个看。。
这涉及到一个观察视野。切割成多个小文件,我可以这么弄:如果在视野范围内,就加载相应的文件,如果不在,就不加载。如果出了视野范围,还要卸载相应的文件。这样的话,文件不用全部载入内存,我也可以实现对文件的漫游。像你说的,每次读取文件不同部分,那岂不是即时读取,岂不是很慢。所以我才想把文件分割成多个小块。
qwqwqw408 2015-06-19
  • 打赏
  • 举报
回复
根本不需要切割,每次根据需要读取文件不同部分即可。你切割成小文件也不能一次全部导入内存,还不是要一个个看。。
赵4老师 2015-06-19
  • 打赏
  • 举报
回复
仅供参考:
#include <sys\stat.h>
#include <io.h>
#include <fcntl.h>
#include <share.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#define MAX_CLU_BYTES 65536
FILE *fo;
int fh;
__int64 offs,offs1;
__int64 rvi64;
int rv,wrv;
unsigned char buf[MAX_CLU_BYTES];
char ofn[_MAX_PATH];
char offstr[80];
char drive[_MAX_DRIVE];
char dir[_MAX_DIR];
char fname[_MAX_FNAME];
char ext[_MAX_EXT];
char fullpath[_MAX_PATH];
void strcpybutcomma(char *t,char *s) {
    char c;

    while (1) {
        c = *s++;
        if (','!=c) *t++ = c;
        if (0==c) break;
    }
}
int main(int argc,char **argv) {
    if (argc<3) {
        printf("Copy File Tail.\n");
        printf("Usage:\n");
        printf("    cft filename.ext {Offset_Begin|-Offset_End|Offset_Begin-Offset_End}\n");
        printf("Copy filename.ext {OB|-OE|OB-OE} to {OB|~OE|OB-OE}-filename.ext\n");
        printf("Note: Byte at OE is NOT included.\n");
        printf("Example:\n");
        printf("    cft abc.rar 12345\n");
        printf("Copy abc.rar offset 12345-end to 12345-abc.rar\n");
        printf("    cft abc.rar -12345\n");
        printf("Copy abc.rar offset -12345-end to ~12345-abc.rar\n");
        printf("    cft abc.rar 123-12345\n");
        printf("Copy abc.rar offset 123-12345 to 123-12345-abc.rar\n");
        printf("    cft abc.rar 0xAB-0xCD\n");
        printf("Copy abc.rar offset 0xAB-0xCD to 0xAB-0xCD-abc.rar\n");
        return 1;
    }
    strcpybutcomma(offstr,argv[2]);
    rv=sscanf(offstr,"%I64i-%I64i",&offs,&offs1);
    if (rv==0) {
        printf("offset %s is not number\n",argv[2]);
        return 2;
    }
    if (NULL==_fullpath(fullpath,argv[1],_MAX_PATH)) {
        printf("Can not get fullpath of %s\n",argv[1]);
        return 10;
    }
    fh=_sopen(fullpath,_O_BINARY|_O_RDONLY|_O_RANDOM,_SH_DENYNO);
    if (fh==-1) {
        printf("_sopen %s errno=%d %s\n",fullpath,errno,strerror(errno));
        return 3;
    }
    if (rv==1) {
        offs1=_filelengthi64(fh);
        if (offs1==-1i64) {
            printf("%I64d=_filelengthi64 errno=%d %s\n",offs1,errno,strerror(errno));
            _close(fh);
            return 4;
        }
        if (offs<0i64) {
            offs=offs1+offs;
            if (offs<0i64) offs=0i64;
        }
    } else {//rv==2
        if (offs>offs1) {
            printf("%s offset_begin %I64d > %I64d offset_end error\n",argv[2],offs,offs1);
            _close(fh);
            return 5;
        }
    }
    rvi64=_lseeki64(fh,offs,SEEK_SET);
    if (rvi64!=offs) {
        printf("%I64d=_lseeki64 %I64d errno=%d %s\n",rvi64,offs,errno,strerror(errno));
        _close(fh);
        return 6;
    }
    _splitpath(fullpath,drive,dir,fname,ext);
    if (offstr[0]=='-') offstr[0]='~';
    sprintf(ofn,"%s%s%s-%s%s",drive,dir,offstr,fname,ext);
    fo=fopen(ofn,"wb");
    if (fo==NULL) {
        printf("fopen %s errno=%d %s\n",ofn,errno,strerror(errno));
        _close(fh);
        return 7;
    }
    cprintf("\n%I64d\r",offs);
    while (1) {
        rv=_read(fh,buf,(unsigned int)__min(offs1-offs,MAX_CLU_BYTES));
        if (rv==0) break;//
        if (rv<0) {
            printf("_read %s offset %I64d errno=%d %s\n",fullpath,offs,errno,strerror(errno));
            fclose(fo);
            _close(fh);
            return 8;
        }
        wrv=fwrite(buf,1,rv,fo);
        if (wrv!=rv) {
            printf("fwrite %s errno=%d %s\n",ofn,errno,strerror(errno));
            fclose(fo);
            _close(fh);
            return 9;
        } else {
            offs+=rv;
            cprintf("%I64d\r",offs);
            if (offs>=offs1) break;//
        }
    }
    fclose(fo);
    _close(fh);
    printf("Copy %s offset %s to %s OK.\n",fullpath,argv[2],ofn);
    return 0;
}

64,651

社区成员

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

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