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

发布于 2022-09-02 01:33:22 字数 4911 浏览 17 评论 0

如题,我还是在读取那个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++;
            
            
            //每行数据为:顶点坐标+法矢量+纹理坐标
            
            
            
            
            
            nor = nil;
            vex1 = nil;
            vex3 = nil;
            vex2 = nil;
            [lineArr removeObjectAtIndex:6];
            [lineArr removeObjectAtIndex:5];
            [lineArr removeObjectAtIndex:4];
            [lineArr removeObjectAtIndex:3];
            [lineArr removeObjectAtIndex:2];
            [lineArr removeObjectAtIndex:1];
            [lineArr removeObjectAtIndex:0];
            
            
        }
        
        
        
        [lineArr removeAllObjects];
        lineArr = nil;
        

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

清风疏影 2022-09-09 01:33:22

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

malloc一个顶点buffer;
while(文件还没完) {
  从文件读一段;
  写到buffer;
  if(顶点buffer满了){
    if (能malloc一个两倍大小的) {
      把旧的内容复制过来;
      旧的释放掉;
      开始用新的;
    } else {
      旧的释放掉;
      文件关掉 返回错误;
    }
  }
}
始终不够 2022-09-09 01:33:22

可以读一部分然后存起来,然后在读另外的一部分。只要不是一次全部用到的数据都可以分开处理。

多情癖 2022-09-09 01:33:22

别读到内存里就可以了

锦爱 2022-09-09 01:33:22

如果你的系统有对换进程管理内存的话,运行内存不够的时候会调节一部分暂时不用的内存内容到存储器,或者把部分要使用的内容添加入内存。

怎会甘心 2022-09-09 01:33:22

我记得大数组循环的时候,可以加autoreleasepool来动态释放内存,不知道你这个需求能不能用

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文