Mengembalikan gambar base64 tanpa kebocoran memori ASP.NET MVC 3

Saya memiliki beberapa gambar yang disimpan dalam database sebagai string base64 dan perlu mengembalikannya dari pengontrol MVC. Bagaimana saya bisa melakukannya tanpa kebocoran memori?

Sebelumnya saya menggunakan ini:

return File(Convert.FromBase64String(pictureString), "image/jpeg");

Namun, proses w3wp mulai menggunakan banyak memori untuk beberapa foto.

Apakah ada cara yang tepat untuk melakukan ini? Saat ini saya telah memutuskan untuk mengatur setiap gambar ke data:image/jpg;base64,string_here dan menggunakan lebih sedikit memori.. tetapi tampaknya memuat halaman juga jauh lebih lambat.

Bantuan apa pun dihargai.


person chemicalNova    schedule 20.09.2011    source sumber
comment
Seberapa besar gambar Anda, yaitu berapa panjang string yang dikodekan base 64 dan JPEG?   -  person Codo    schedule 20.09.2011


Jawaban (2)


+1 Untuk komentar Darin Dimitrov.

Jika gambar/data yang dikodekan base64 lebih dari 85K maka akan dialokasikan di LOH (tumpukan objek lage). GC untuk alokasi tersebut lebih mahal karena harus menunggu pengumpulan generasi 2.

Pendekatan lain jika Anda harus tetap menggunakan gambar yang dikodekan Base64 adalah dengan mengimplementasikan aliran Anda sendiri yang membaca data dari nilai yang dikodekan Base64 dalam potongan untuk menghindari alokasi blok memori besar kedua. Jika Anda juga dapat membaca string secara chunck, Anda akan dapat menghindari alokasi objek di LOH dan berpotensi hanya menggunakan kembali buffer yang sangat kecil untuk membaca/mendekode.

person Alexei Levenkov    schedule 20.09.2011
comment
Terima kasih untuk informasinya. Saya telah menandai ini sebagai jawaban karena gambar yang dimuat lebih besar dari 85k. Sejak itu saya harus menulis ulang seluruh aplikasi (saya tidak menulisnya sejak awal :/). Terima kasih atas semua sarannya! - person chemicalNova; 13.10.2011

Sebelumnya saya menggunakan ini:

Tidak ada kebocoran dalam kode ini. Masalahnya adalah ia memuat seluruh gambar ke dalam memori sebelum mengalirkannya ke respons. Peningkatan memori yang Anda amati pada proses w3p adalah normal dan setelah Pengumpul Sampah menendangnya, ia akan membersihkannya. Anda tidak perlu terlalu khawatir tentang hal itu kecuali Anda menyajikan beberapa gambar yang sangat besar.

Masalah dengan desain Anda adalah Anda menggunakan base64 yang berarti Anda perlu memuat seluruh konten sebelum dapat mendekodekannya kembali ke array byte. Pendekatan lain adalah dengan menyimpan gambar sebagai data mentah di database Anda dan kemudian menggunakan aliran untuk membacanya dalam beberapa bagian dan segera menulis potongan tersebut ke respons. Dengan cara ini hanya potongan yang sedang diproses yang dimuat ke dalam memori pada waktu tertentu.

Namun pendekatan lain yang mungkin saya sarankan kepada Anda adalah dengan tidak menyimpan gambar dalam database sama sekali tetapi menyimpannya di sistem file dan hanya menyimpan path ke gambar dalam database. Kemudian dalam tindakan pengontrol yang harus Anda lakukan adalah return File(pathToTheImage, "image/jpeg").

Sebagai pengoptimalan tambahan, jika gambar tersebut tidak sering berubah, Anda dapat menambahkan cache keluaran yang tepat ke tindakan pengontrol yang menyajikan gambar tersebut agar tidak mengenainya setiap saat.

person Darin Dimitrov    schedule 20.09.2011
comment
Terima kasih atas saran Anda.. mereka pasti membantu saya saat menulis ulang aplikasi! - person chemicalNova; 13.10.2011