读取一个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++;
//每行数据为:顶点坐标+法矢量+纹理坐标
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
你不需要文件全部内容同时在内存, 有个几行的"窗口"可以了.
别读到内存里就可以了
如果你的系统有对换进程管理内存的话,运行内存不够的时候会调节一部分暂时不用的内存内容到存储器,或者把部分要使用的内容添加入内存。
我记得大数组循环的时候,可以加autoreleasepool来动态释放内存,不知道你这个需求能不能用