2012-06-20 25 views
12

tôi sử dụng cả hai sau, nhưng không làm việc cho rất lớn data..of 12 mbTải xuống dữ liệu văn bản 12 mb từ url và lưu vào thẻ sd ... Heap memory prob xảy ra. bất kì giải pháp nào?

char[] chars = new char[1024]; 
int len; 
while((len=buffer.read(chars))>0) { 
    data.append(chars,0,len); 
} 

while ((line = reader.readLine()) != null) { 
    sb.append(line + "\n"); 
} 
+0

Tôi đang phân tích cú pháp xml .. vì vậy toàn bộ xml cần trong chuỗi đơn .. nếu tôi được lưu trữ trong thẻ sd thì tôi cũng phải đọc nó trong chuỗi cũng yêu cầu bộ nhớ heap nhiều hơn ... kết quả là sự cố .. –

Trả lời

-1

Tôi đã gặp vấn đề tương tự và tôi sử dụng tệp này, Bạn nên chia tệp xml nếu có thể và sau đó thử đọc tệp đó thành chuỗi và phân tích cú pháp.

+0

Cảm ơn đây cũng là ý tưởng hay cho tôi. . :) –

+0

Bạn có thể giải thích bạn định phân tích cú pháp phần nào của XML? Nó sẽ không hợp lệ từ những gì tôi biết. –

1

Bạn có lẽ nên thử phân bổ toàn bộ 12MB vào bộ nhớ và sau đó kiểm tra xem phân bổ thành công. Sau đó tải dữ liệu vào bộ đệm.

Hoặc, nếu bạn có thể tải tệp ở các bộ phận và xử lý chúng, nó sẽ hiệu quả theo cách này.

2

Tại sao không đọc XML của bạn theo từng phần và lưu từng đoạn vào thẻ SD? Vấn đề duy nhất trong giải pháp này là bạn cần một số loại trình phân tích cú pháp luồng XML bằng cách sử dụng mà bạn có thể tự động tải các phần của XML của bạn và phân tích cú pháp chúng.

Có thể bạn có thể sử dụng API truyền trực tuyến cho XML, được gọi là StaX và viết luồng đầu vào tùy chỉnh cho trường hợp này. Một số ví dụ: http://www.vogella.com/articles/JavaXML/article.html#javastax

8

Lưu dữ liệu theo khối vào thẻ SD. Sau đó, sử dụng built-in XmlPullParser, bạn có thể phân tích các tập tin đã lưu trước đó theo cách sau Android:

  1. mở thêm một input stream trên các tập tin bạn vừa tải về
  2. Sử dụng phương pháp setInput(InputStream inputStream, String inputEncoding)
  3. Hãy vui vẻ trong khi phân tích tệp XML khổng lồ này.
2
  1. Tạo XmlPullParser dụ
  2. Gọi XmlPullParser.setInput với đầu vào của bạn (hoặc Reader hoặc InputStream); đó là dữ liệu bạn tải xuống (theo Ổ cắm hoặc cách khác)
  3. Sử dụng các chức năng của XmlPullParser để phân tích cú pháp tệp văn bản xml của bạn.

Lưu ý: bạn cần thực hiện thao tác này trên chuỗi không phải chính, có thể mất nhiều thời gian để tải xuống tệp. (Dù sao bạn không thể thực hiện nhiệm vụ mạng trên chuỗi giao diện người dùng). Điều này sẽ hiệu quả về bộ nhớ, XmlPullParser không lưu dữ liệu trong bộ nhớ. Không cần lưu trữ tệp vào thẻ SD trước.

Đồng thời xem lỗi: thời gian chờ kết nối, lỗi trong xml, v.v. Hãy coi công việc của bạn là thành công khi trình phân tích cú pháp báo cáo rằng nó đã kết thúc tài liệu.

3

đọc trong phần 1MB dữ liệu & sử dụng SAXParser cho phân tích

1

Bạn cần phải phân tích toàn bộ dòng XML và tạo ra một đối tượng DOM khổng lồ, hoặc sẽ phân tích khối làm gì?

Nếu bạn PHẢI phân tích cú pháp XML hoàn chỉnh, điều duy nhất bạn có thể thực hiện là có thêm bộ nhớ và hệ điều hành 64 bit.
Nếu không, hãy sử dụng trình phân tích cú pháp SAX hoặc StAX để lấy và phân tích cú pháp các đoạn trực tiếp từ luồng hoặc sau khi bạn lưu cục bộ.

1

Như đã nêu bởi người dùng, tôi khuyên bạn nên tải xuống chunk và không phải toàn bộ tập tin cùng một lúc, gây ra nếu bạn đang làm nó trên tread chính nó có thể làm chậm tất cả các ứng dụng của bạn, do đó, làm điều đó với asynctask và làm nó chunk bởi chunk. Ngoài ra tôi có thể giới thiệu cho bạn một số bài về chủ đề này.

-Trong this bài bạn có thể tìm thấy một liên kết đến một bài viết về how to use SAX

-Trong this một bạn có thể tìm thấy một SAX and DOM tutorial

Tôi hy vọng hai bài báo này có thể giúp bạn đạt được những gì bạn cần. Hoặc nếu cả hai bài viết đều thất bại với vấn đề của bạn, thì bạn có thể cố tìm cách tốt hơn để sắp xếp XML của bạn, luôn có cách tốt hơn để làm điều đó, bạn chỉ cần suy nghĩ một chút khó khăn hơn.

UPDATE:

-Đây bài khác về STAX có thể hữu ích, nguyên nhân là một Api Streaming cho xử lý XML, vì vậy nó có thể là tốt nhất cho trường hợp của bạn.

+0

Tại sao không thay vì cố gắng mở lại câu hỏi của bạn, bạn nên bắt đầu tìm kiếm một câu hỏi tương tự, hoặc làm lại câu hỏi của bạn để nó có thể dễ đọc hơn, thậm chí nếu nó được mở, tôi không thấy tương lai tươi sáng cho nó. NHƯNG có thể điều này có thể giúp bạn [BÀI ĐĂNG THAM GIA MÔ PHỎNG] (http://stackoverflow.com/questions/1357403/how-to-cartoon-ify-an-image-programmatically) –