开发者社区> 问答> 正文

读取一个100+M的文件,读取时候手机运行内存超过了900M,如何能再给压缩压缩?

如题,我还是在读取那个stl文件,然后读取一个100多M得文件的时候,运行内存十分大,我使用的方式是以文本形式读取文件并按行分开存到一个NSArray,然后再拆分NSArray细分找到需要的数据转成float型在存到float数组内。。。但是在读取的时候运行内存已经超过了900M,这肯定是不行的。
请问还有什么思路换种方式去进行读取,让内存降下来。现在的情况是我再模拟器可以读出来文件,但在自己的手机上肯定是崩的。

代码如下:

float *squareVertexData;//数据集合
int faceNum;//三角片面数

NSString *fileContext = [NSString stringWithContentsOfFile:curFileName encoding:NSUTF8StringEncoding error:nil];
        
        
        //声明可变数组用户存储文件的没一行数据
        NSMutableArray *lineArr;
        if (lineArr == nil) {
            lineArr   = [[NSMutableArray alloc]init];
        }
        
        
        
        [lineArr addObjectsFromArray:[fileContext componentsSeparatedByString:@"\n"]];//按行取出模型文件数据
        fileContext = nil;
        
        //删除没用的影响循环的数据
        [lineArr removeObjectAtIndex:0];//删除第一行solid+文件名 数据
        [lineArr removeLastObject];//删除最后一行“  ”数据
        [lineArr removeLastObject];//删除倒数第二行endsolid数据
        
        
        
       
        
      faceNum = (int)lineArr.count/7;//循环次数
      squareVertexData = (float *)malloc(faceNum*24*sizeof(float));//给float数组空间
        
        for (int i=0; i<faceNum; i++) {
            
            
            
            //每一个循环内我会取出每段带有有效数据的字符串再将其分割出来单独取出有效数据。
            //每个循环内有四段有效数据,每段有效数据都是三个浮点数,我需要将第一段有效数据内取出的三个浮点数添加到第2、3、4段有效数据的浮点数后再添加两个1.0浮点数存储起来供使用
            
            NSArray *nor = [lineArr[0] componentsSeparatedByString:@" "];//包含有效数据1
            NSArray *vex1 = [lineArr[2] componentsSeparatedByString:@" "];//包含有效数据2
            
            
            
            
            int count = 0;
            
            
            squareVertexData[i*24+count] = [vex1[vex1.count-3] floatValue];
            count++;
            squareVertexData[i*24+count] = [vex1[vex1.count-2] floatValue];
            count++;
            squareVertexData[i*24+count] = [vex1[vex1.count-1] floatValue];
            count++;
            
            squareVertexData[i*24+count] = [nor[nor.count-3] floatValue];
            count++;
            squareVertexData[i*24+count] = [nor[nor.count-2] floatValue];
            count++;
            squareVertexData[i*24+count] = [nor[nor.count-1] floatValue];
            count++;
            squareVertexData[i*24+count] = 1.0;
            count++;
            squareVertexData[i*24+count] = 1.0;
            count++;
            
            
            
            
            
            
            
            
            
            
            NSArray *vex2 = [lineArr[3] componentsSeparatedByString:@" "];//第二段有效数据
            
            squareVertexData[i*24+count] = [vex2[vex2.count-3] floatValue];
            count++;
            squareVertexData[i*24+count] = [vex2[vex2.count-2] floatValue];
            count++;
            squareVertexData[i*24+count] = [vex2[vex2.count-1] floatValue];
            count++;
            
            squareVertexData[i*24+count] = [nor[nor.count-3] floatValue];
            count++;
            squareVertexData[i*24+count] = [nor[nor.count-2] floatValue];
            count++;
            squareVertexData[i*24+count] = [nor[nor.count-1] floatValue];
            count++;
            squareVertexData[i*24+count] = 1.0;
            count++;
            squareVertexData[i*24+count] = 1.0;
            count++;
            
            
            
            
            
            NSArray *vex3 = [lineArr[4] componentsSeparatedByString:@" "];//第三段有效数据
            
            squareVertexData[i*24+count] = [vex3[vex3.count-3] floatValue];
            count++;
            squareVertexData[i*24+count] = [vex3[vex3.count-2] floatValue];
            count++;
            squareVertexData[i*24+count] = [vex3[vex3.count-1] floatValue];
            count++;
            
            squareVertexData[i*24+count] = [nor[nor.count-3] floatValue];
            count++;
            squareVertexData[i*24+count] = [nor[nor.count-2] floatValue];
            count++;
            squareVertexData[i*24+count] = [nor[nor.count-1] floatValue];
            count++;
            squareVertexData[i*24+count] = 1.0;
            count++;
            squareVertexData[i*24+count] = 1.0;
            count++;
            
            
            //每行数据为:顶点坐标+法矢量+纹理坐标
            

以上,如有不清楚的,追问下我,谢谢大家。

展开
收起
杨冬芳 2016-05-30 20:24:09 2208 0
1 条回答
写回答
取消 提交回答
  • IT从业

    你不需要文件全部内容同时在内存, 有个几行的"窗口"可以了.

    malloc一个顶点buffer;
    while(文件还没完) {
      从文件读一段;
      写到buffer;
      if(顶点buffer满了){
        if (能malloc一个两倍大小的) {
          把旧的内容复制过来;
          旧的释放掉;
          开始用新的;
        } else {
          旧的释放掉;
          文件关掉 返回错误;
        }
      }
    }
    2019-07-17 19:21:02
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
手机卫士性能优化方案-Android篇 立即下载
从500万到2.4亿,手机QQ移动网络接入优化之路 立即下载
云服务器ECS内存增强型实例re6全新发布 立即下载