Exhausted heap space, trying to allocate 134217744 bytes

67 views
Skip to first unread message

王士博

unread,
Nov 28, 2022, 3:52:14 AM11/28/22
to Dart Misc
Hello, everyone, I used RandomAccessFile to upload large files, and then upload the process of prompt out of memory. Is there any solution?
this is my code:
getPaging(
CancelRequest cancelRequest, path, uploadId, fileName, WJDataType type,
{Function? uploadVideoUrl,
String? unitGuid,
int pageFileSize = 0,
int? totalSize,
int number = 0,
String? md5Srting,
Function(int, int, int)? callBack}) async {
// var s = await File(path).readAsBytes();
File file = File(path);
int x = pageFileSize;
var s = await file.open();
int size = await file.length();
List<int> val = [];
int num = size % EndPoints.chunkSize > 0 ? 1 : 0;
int num1 = size ~/ EndPoints.chunkSize + num;
int num2;
if (number > 1) {
num2 = number - 1;
} else {
num2 = 0;
}
bool isTrue = true;
var response;
// bool isBreak = false;
// Stream stream;
while (x < size) {
if (!cancelRequest.isPaused) {
int _len =
size - x >= EndPoints.chunkSize ? EndPoints.chunkSize : size - x;
num2++;
bool lastChunk = num1 != num2 ? false : true;
// val = s.sublist(x,x+_len);
// val = await IsoLateTools().filePage(data: {'file':s,'length':_len,'start':x});
// val = await getRange(path, x, x+_len);
await s.setPosition(x);
val = await s.read(_len);
x = x + _len;
wjLogString(
msg: "2: ${val.runtimeType}-----$num1------$num2----$lastChunk");
try {
dio.MultipartFile multipartFile = dio.MultipartFile.fromBytes(
Uint8List.fromList(val),
filename: "$num2$fileName");
Map<String, dynamic> tempMap = {
"multipartFile": multipartFile,
"uploadId": uploadId,
"fileName": "$fileName",
"fileSort": num2,
"fileSortCounts": num1,
"lastChunk": lastChunk
};
dio.FormData formData = dio.FormData.fromMap(tempMap);
response = await WJHttpInstance.requestMethod(EndPoints.uploadPart,
type: RequestType.post,
data: formData, onSendProgress: (value1, value2) {
if (callBack != null) {
callBack(value1, value2, _len);
}
}, contentType: 'multipart/form-data');

if (response.data['code'] != 200) {
isTrue = false;
cancelRequest.changePaused(true);
EasyLoading.showError("网络出错了,上传失败!");
wjLogString(msg: "已存储的大小:$x,总的文件大小:$size");
try {
SqliteTools.getTodo(unitGuid!).then((value) {
TodoModdel model1 = TodoModdel();
model1 = value;
model1.uploadId = uploadId;
model1.number = num2;
model1.size = x;
wjLogString(msg: "网络出错时存储的数据model1:${model1.toMap()}");
SqliteTools.update(model1).then((value1) {
EasyLoading.dismiss();
EasyLoading.showSuccess("数据存储成功");
s.closeSync();
// SpUtil.putInt(CommonString.checkToLoad, 1);
// SqliteTools.close();
Future.delayed(const Duration(seconds: 2), () {
Get.offAllNamed(AppRoutes.tabbar);
});
});
});
} catch (e) {
EasyLoading.dismiss();
EasyLoading.showSuccess("数据存储失败");
s.closeSync();
Future.delayed(const Duration(seconds: 2), () {
Get.offAllNamed(AppRoutes.tabbar);
});
}
break;
} else {
EasyLoading.dismiss();
if (lastChunk) {
if (cancelRequest.isPaused) {
EasyLoading.showToast('数据即将上传完成,请稍等...');
}
cancelRequest.changePaused(false);
s.closeSync();
} else {
if (cancelRequest.isPaused) {
EasyLoading.show(status: "数据存储中请稍后...");
wjLogString(msg: "已存储的大小:$x,总的文件大小:$size");
try {
SqliteTools.getTodo(unitGuid!).then((value) {
TodoModdel model1 = TodoModdel();
model1 = value;
model1.uploadId = uploadId;
model1.number = num2;
model1.size = x;
wjLogString(msg: "暂停上传后存储的model值:${model1.toMap()}");
SqliteTools.update(model1).then((value1) {
EasyLoading.dismiss();
EasyLoading.showSuccess("数据存储成功");
// SpUtil.putInt(CommonString.checkToLoad, 1);
// SqliteTools.close();
Future.delayed(const Duration(seconds: 2), () {
Get.offAllNamed(AppRoutes.tabbar);
});
});
});
} catch (e) {
EasyLoading.dismiss();
EasyLoading.showSuccess("数据存储失败");
s.closeSync();
Future.delayed(const Duration(seconds: 2), () {
Get.offAllNamed(AppRoutes.tabbar);
});
}
break;
} else {
try {
SqliteTools.getTodo(unitGuid!).then((value) {
TodoModdel model1 = TodoModdel();
model1 = value;
model1.uploadId = uploadId;
model1.number = num2;
model1.size = x;
wjLogString(msg: "实时存储的model值:${model1.toMap()}");
SqliteTools.update(model1).then((value1) {
wjLogString(msg: "数据存储成功");
});
});
} catch (e) {
EasyLoading.showSuccess("数据存储失败");
s.closeSync();
Future.delayed(const Duration(seconds: 2), () {
Get.offAllNamed(AppRoutes.tabbar);
});
}
}
}
wjLogString(msg: '已经上传的大小:${num2 * EndPoints.chunkSize}');
}
} catch (e) {
isTrue = false;
cancelRequest.changePaused(true);
EasyLoading.showError("网络出错了,上传失败!");
wjLogString(msg: "当前分片的位置num2:$num2,已存储的大小:$x,总的文件大小:$size-----$e");
s.closeSync();
try {
SqliteTools.getTodo(unitGuid!).then((value) {
TodoModdel model2 = TodoModdel();
model2 = value;
model2.uploadId = uploadId;
model2.number = num2;
model2.size = x;
wjLogString(msg: "网络出错时存储的数据model2:${model2.toMap()}");
SqliteTools.update(model2).then((value1) {
wjLogString(msg: "网络出错时更新数据返回的数据value1:$value1");
EasyLoading.dismiss();
EasyLoading.showSuccess("数据存储成功");
// SpUtil.putInt(CommonString.checkToLoad, 1);
// SqliteTools.close();
Future.delayed(const Duration(seconds: 2), () {
Get.offAllNamed(AppRoutes.tabbar);
});
});
});
} catch (e) {
EasyLoading.dismiss();
EasyLoading.showSuccess("数据存储失败");
s.closeSync();
Future.delayed(const Duration(seconds: 2), () {
Get.offAllNamed(AppRoutes.tabbar);
});
}
break;
}
}
if (!cancelRequest.isPaused) {
wjLogString(msg: "${response.data['data']}");
wjLogString(msg: "size:$size");
if (isTrue) {
var uploadPath = response.data["data"];
try {
SqliteTools.getTodo(unitGuid!).then((value) {
TodoModdel model2 = TodoModdel();
model2 = value;
model2.urlString = uploadPath;
SqliteTools.update(model2).then((value1) {
wjLogString(msg: "上传成功合并成功后存储的Model2:${model2.toMap()}");
});
});
} catch (e) {
wjLogString(msg: "上传完成时存储urlString的报错信息$e");
}
uploadVideoUrl!(uploadPath, size);
await s.close();
} else {
EasyLoading.showError("出错了,请重新上传!");
}
}
}
Reply all
Reply to author
Forward
0 new messages