2010-01-08 12 views
7

Hãy làm cho nó rõ ràng ngay lập tức: đây không phải là một câu hỏi về rò rỉ bộ nhớ! Tôi có một trang cho phép người dùng nhập một số dữ liệu và một JavaScript để xử lý dữ liệu này và tạo ra kết quả. JavaScript tạo ra gia tăng trên một DIV, một cái gì đó như thế này:javascript để tìm bộ nhớ có sẵn

(function() 
{ 
    var newdiv = document.createElement("div"); 
    newdiv.innerHTML = produceAnswer(); 
    result.appendChild(newdiv); 
    if (done) { 
     return; 
    } else { 
     setTimeout(arguments.callee, 0); 
    } 
})(); 

Trong những trường hợp nhất định việc tính toán sẽ tạo ra dữ liệu nhiều đến nỗi IE8 sẽ thất bại với tin nhắn này:

không đủ lưu trữ khi xử lý quá nhiều dữ liệu

Câu hỏi đặt ra là: có cách nào tôi có thể tính lượng dữ liệu quá nhiều không?

như tôi đã nói không có lỗi để giải quyết. Đó là một bộ nhớ chính hãng vì tính toán yêu cầu tạo quá nhiều phần tử html.

Ý tưởng của tôi là chạy một hàm trước khi thực hiện tính toán để tiến hành nếu trình duyệt thành công. Nhưng để làm như vậy, theo một cách chung chung, tôi nghĩ rằng tôi cần phải tìm bộ nhớ có sẵn cho trình duyệt của tôi.

Bất kỳ đề xuất nào đều được hoan nghênh.

+0

với dữ liệu rất nhiều, không thể cho người dùng thậm chí đối phó? – jldupont

+0

Công cụ có hoạt động để bao quanh mã với try/catch không? – erikkallen

+0

'memory.performance.usedJSHeapSize' chỉ hoạt động tốt trong Chrome ngay bây giờ. –

Trả lời

5

Javascript (trong trình duyệt) được chạy trong một sandbox, có nghĩa là nó là rào-off từ thứ truy cập có thể gây ra các vấn đề an ninh như các tập tin địa phương, tài nguyên hệ thống vv - vì vậy không, bạn có thể' t phát hiện sử dụng bộ nhớ.

Là trạng thái câu trả lời khác, bạn có thể làm cho tác vụ dễ dàng hơn cho trình duyệt bằng cách tạm dừng giữa triển khai hoặc sử dụng ít mã tốn nhiều tài nguyên hơn, nhưng mọi trình duyệt đều có giới hạn.

+0

cảm ơn câu trả lời của bạn. Tôi nghi ngờ rằng tôi không thể phát hiện việc sử dụng bộ nhớ. – Zo72

0

Tôi nghi ngờ có sự chậm trễ thời gian chờ là 0 - vấn đề - nó đang cố gắng chạy lại ngay lập tức. Hãy thử tăng điều này.

+0

không có. độ trễ thời gian chờ là một kỹ thuật nổi tiếng. google xung quanh nếu bạn không tin tôi. – Zo72

1

Vòng lặp sẽ sử dụng ít bộ nhớ hơn đệ quy.

do 
    { 
    var newdiv = document.createElement("div"); 
    newdiv.innerHTML = produceAnswer(); 
    result.appendChild(newdiv); 
    } while (!done); 

Bạn cũng có thể đặt một số giới hạn trên cho số câu trả lời được tạo.

var answerCount = 0; 
    do 
    { 
    var newdiv = document.createElement("div"); 
    newdiv.innerHTML = produceAnswer(); 
    result.appendChild(newdiv); 
    } while (!done && answerCount++ < 1000); 
+0

Bạn đã hoàn toàn hiểu nhầm câu hỏi. không có đệ quy nào !!! ------------------------- – Zo72

+0

Gửi đối số.callee để setTimeout gọi hàm một lần nữa, nhưng bạn đúng, nó không phải đệ quy nghiêm ngặt bởi vì setTimeout cho phép hàm gọi lại trả về (ít nhất nó nên, nhưng có lẽ delay = 0 được tối ưu hóa để gọi ngay lập tức, trong trường hợp này được đệ quy). Sử dụng vòng lặp có bộ đếm sẽ vẫn trợ giúp và mã sẽ dễ đọc hơn. –

+0

ngay cả với độ trễ = 0 bạn không có đệ quy. – Zo72

3

Có một vở kịch với điều này ...

document.write(performance.memory.jsHeapSizeLimit+'<br><br>'); 
document.write(performance.memory.usedJSHeapSize+'<br><br>'); 
document.write(performance.memory.totalJSHeapSize); 
+0

đối tượng hiệu suất ... tốt để biết cảm ơn – Zo72