如果@DannyTuppeny s不解決您的問題,您可以增加堆大小。 我想這應該是做它
old_gen_heap_size: 1024 (Max size of old gen heap size in MB,e.g: --old_gen_heap_size=1024 allows up to 1024MB old gen heap)
dart --old_gen_heap_size=1024 somefile.dart
或
export DART_VM_OPTIONS="--old_gen_heap_size=1024"
http://dartbug.com/13744還提到--new_gen_heap_size
但dart --print-flags
不會列出它的標誌。 我不知道這是否被支持和它做了什麼。
我在您的代碼中看到的問題是,所有圖像幾乎一次開始下載,而在收到時它們使用堆內存。 @DannyTupeny的代碼也不會改變這一點。
您可以通過僅在前一個請求完成時調用新請求來限制併發下載的文件數,也可以在接收到數據時使用流將數據寫入文件,因此無需在內存中緩衝完全。 我還沒有自己做過這件事,至少在星期日之前沒有時間查看它,但也許其他人可以提供更多的細節。
要將傳入的數據直接重定向到文件而不緩衝整個文件在內存中這應該工作,但我無法重現內存不足的問題,所以我不能肯定地說。
import 'dart:io' as io;
import 'dart:async' as async;
import 'package:path/path.dart' as path;
import 'package:http/http.dart' as http;
var images = [
"https://c4.staticflickr.com/4/3880/15283361621_bc72a1fb29_z.jpg",
"https://c2.staticflickr.com/4/3923/15101476099_6e1087b76c_h.jpg",
"https://c2.staticflickr.com/4/3899/15288834802_073d2af478_z.jpg",
"https://c4.staticflickr.com/4/3880/15283361621_bc72a1fb29_z.jpg",
"https://c2.staticflickr.com/6/5575/15101869429_fa44a80e87_z.jpg",
"https://c1.staticflickr.com/3/2941/15100232360_03f3631c44_z.jpg",
"https://c1.staticflickr.com/3/2941/15269480156_a28e1c0dbb_b.jpg",
"https://c2.staticflickr.com/4/3907/15103503127_195ffcd5c0_z.jpg",
"https://c2.staticflickr.com/6/5595/15265903986_a3210505f4_c.jpg",
"https://c2.staticflickr.com/6/5567/15100857617_9926f2a189_z.jpg",
"https://c1.staticflickr.com/3/2941/15100542247_6e9c3f13ae_z.jpg",
"https://c2.staticflickr.com/4/3852/15099895539_cf43a904a5_z.jpg"
];
main() {
var futures = <async.Future>[];
images.forEach((url) {
futures.add(new http.Request('GET', Uri.parse(url))
.send().then((response) {
var f = new io.File(path.basename(url));
var sink = f.openWrite();
sink.addStream(response.stream)
.then((_) => sink.close());
}));
});
async.Future.wait(futures) // wait for all image downloads to be finished
.then((_) => print('done'));
}
這工作完全解決我的記憶問題。我可能想重新訪問以支持同時下載多個文件。謝謝。我學到了一些新東西。 – 2014-09-20 02:03:14