2016-04-11 14 views
0

Uygulamam GPX dosyalarını (XML) alabilir ve sonra XML ve GPX ayrıştırma harika bir iş yapar harika XML Dictionary kütüphane kullanabilirsiniz, ama bu durumda Denemek ve ayrıştırmak istediğim 85MB'lık bir dosya. Devasa 16.000'den fazla GPX yol noktası içerir.Büyük bir XML dosyası ayrıştırılamıyor nasıl bellek tükendi değil

Şu anda NSURL'u NSData içine okudum ve ayrıştırıcıyı kullanın. Ama büyük dosya ile çalışırken bellek uyarıları ve çökme olur.

Böyle büyük bir dosyanın ayrıştırılmasını nasıl yapılandırabilirim, böylece bellek hataları almıyorum?

cevap

1

Kullandığınız XML Sözlüğü kitaplığı ile ilgili sorun, tüm XML dosyasının büyük bir nesne ağacını oluşturmasıdır. Bu çok hafıza kullanır.

Standart NSXMLParser sınıfı gibi bir SAX ayrıştırıcısı kullanmaktan daha iyidir. Ayrıştırma ilerledikçe tuttuğunuz veri yapıları dışında hiçbir şey bellekte tutulur. Her iki durumda da, ayrıştırmadan önce tüm XML dosyasını belleğe yüklemeniz gerekmez. Dosyaya bir akış açın ve akışı ayrıştırıcıya iletin.

+0

'XML Dictionary'' NSXMLParser' işlevini kullanmaktadır. Ne farklılar? –

+0

Github projesinin ana sayfasında açıklamayı okuyun. XML Sözlük, tüm XML belgesini temsil eden büyük bir ağaç ağacı oluşturuyor. NSXMLParser'ın yaptıklarının ötesine geçen bu ekstra yük, bellek sorunlarına neden oluyor. Esas olarak XML dosyasının 3 kopyası bellekte var. 1) Tüm dosyanın tam "NSData". 2) XML Sözlük tarafından oluşturulan dev ağaç. 3) Ayrıştırılmış XML'i işledikten sonra kendi veri modeliniz. # 1, tüm dosyayı belleğe yüklemek yerine XML dosyasına bir akış açarak önlenebilir. Ve sadece NSXMLParser kullanarak # 2'den kaçınabilirsiniz. – rmaddy

+0

Orada yapan herhangi bir yardımcı sınıf var mı? NSXMLParser'ı kullanarak bahsettiğiniz şekilde bir akış açma hakkında orada çok az bilgi buluyorum. –

İlgili konular