» Poradna » Programy

ASP.NET MVC - po uploadu souboru zustane alokovana operacni pamet

Odpovědět  |  Zobrazit bez stromu  |  Upozornit redakci  |  nových odpovědí: 12/12
 |   |  Microsoft Windows 8 Chrome 27.0.1453.94  |  [91.219.245.---]

Zdravím,vytvoril jsem si jednoduchou sajtu mvc (4) kde mam jen jednu stranku pro upload souboru, jedno tlacitko pro zvoleni konkretniho souboru a druhy primo pro upload, problem je, ze kdyz zvolim soubor a ten se zapise na disk, tak zustane alkovana operacni pamet ve velikosti uploadovanyho souboru, v task manageru se to jevi jako "Standby memory", jde o cache, zkousel jsem ruzne mazat a bez uspechu, v projektu jsem nic nemenil krome nasledujiciho(uz fakt nevim kde by mohl byt problem tak jsem zacal uplne nanovo projekt)Screen task manageru : http://imageshack.us/photo/my-images/801/taskm... Web config :"httpRuntime targetFramework="4.5" maxRequestLength="2147483647" /""security requestFiltering requestLimits maxAllowedContentLength="2147483647" / /requestFiltering/security"ve view :"form action="Home/Upload" method="post" enctype="multipart/form-data" label for="file">Filename:</label input type="file" name="file" id="file" / input type="submit" //forma v controlleru : [HttpPost] public ActionResult Upload(HttpPostedFileBase file) { if (file.ContentLength > 0) { var fileName = Path.GetFileName(file.FileName); var path = Path.Combine(Server.MapPath("~/App_Data/"), fileName); file.SaveAs(path); } return RedirectToAction("Index"); }

Odpovědi na otázku

 |   |  Microsoft Windows 7 Chrome 27.0.1453.94

A čemu to vadí?

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 27.0.1453.94  |  [91.219.245.---]

Dalsimu zpracovani dat, konkretne : potrebuju data zpracovat aby je bylo mozne poslat na WCF sluzbu, jenze kdyz chci prevest data do pole bajtu, tak to opet vyzaduje misto v pameti, jenze to nema = problem, ledaze by slo nejak vynutit prostor v pameti, takhle vypada moje metoda pro upload (puvodni) : [HttpPost] public ActionResult Index(HttpPostedFileBase file) { using (UploadService.UploadClient upload = new UploadService.UploadClient()) { UploadService.UploadInfo info = new UploadService.UploadInfo(); byte[] buffer = new byte[file.ContentLength]; file.InputStream.Read(buffer, 0, file.ContentLength); info.FileData = buffer; info.FileName = file.FileName; info.ContentLength = file.ContentLength; info.ContentType = file.ContentType; upload.UploadFile(info); } return RedirectToAction("Index"); }

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 27.0.1453.94  |  [91.219.245.---]

Dalsimu zpracovani dat, konkretne : potrebuju data zpracovat aby je bylo mozne poslat na WCF sluzbu, jenze kdyz chci prevest data do pole bajtu, tak to opet vyzaduje misto v pameti, jenze to nema = problem, ledaze by slo nejak vynutit prostor v pameti, takhle vypada moje metoda pro upload (puvodni) : [HttpPost] public ActionResult Index(HttpPostedFileBase file) { using (UploadService.UploadClient upload = new UploadService.UploadClient()) { UploadService.UploadInfo info = new UploadService.UploadInfo(); byte[] buffer = new byte[file.ContentLength]; file.InputStream.Read(buffer, 0, file.ContentLength); info.FileData = buffer; info.FileName = file.FileName; info.ContentLength = file.ContentLength; info.ContentType = file.ContentType; upload.UploadFile(info); } return RedirectToAction("Index"); }

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 27.0.1453.94

Ten InputStream by to po skončení chtělo zavřít.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 27.0.1453.94  |  [91.219.245.---]

No, nehlede na uzavreni inputstreamu ta cache roste, ale ted jsem to zkousel a problem zustava (resp. nezaznamenal jsem nejaky vyrazny pokles pameti), jeste abych to upresnil, problem nastava na 2 mistech podle dostupnosti pameti : 1)byte[] buffer = new byte[file.ContentLength];2)upload.UploadFile(info);kdyz uz je cache pres celou volnou pamet = "Exception of type 'System.OutOfMemoryException' was thrown."- to znamena ze momentalne potrebuju aby bylo misto v pameti na 3x velikost souboru, jako idelani reseni by bylo, kdyby se data zapisovala rovnou na disk misto do pameti (napriklad kdybych mel SSD)

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 27.0.1453.94  |  [89.102.236.---]

Pokud posilas pres WCF vetsi soubory, je efektivnejsi pouzit streamy misto bufferu.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 27.0.1453.94  |  [91.219.245.---]

diky, to zni rozumne, jestli to funguje tak, ze po precteni casti souboru data hned odesle po nejakejch segmentech, tak by to bylo supr, tzn ze by bylo potreba jen zlomek pameti, nebo to funguje jinak? ale timhle si mi pridal vitr do plachet :) hned mam lepsi naladu :D protoze pri predstave ze jeden klient zahlti server jednim uploadem, to by asi moc nefungovalo

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 27.0.1453.94  |  [89.102.236.---]

Přesně tak. Posílají se jen malé bloky dat (tzv. chunky), třeba po 64Kbytech. U WCF to funguje tak, že klient službě předá objekt streamu a služba už jen na tomto objektu vola Read.Pro více informací mrkni třeba sem:http://www.codeproject.com/Articles/166763/WCF-Strea...

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Chrome 27.0.1453.94  |  [217.77.169.---]

Diky, zkusil jsem to podle toho codeprojectu a je to funkcni , akorat kdyz je to ted streamovany, nepodarilo se mi najit zadnej sample jak by slo udelat asynchronni uploadovani resp. chapu to tak, ze to v podstate probiha stejne, ale nevygoogloval jsem jak zpetne podat asynchronne uzivateli info o stavu, resp. lze nejak nakonfigurovat streamujici metodu aby zpetne odesilala treba stav kolik se toho uz odeslalo, nebo treba jen bool hodnotu, ze bylo uspesne odeslano aby se na strane aplikace pocitalo celkovy prenos? Nekde jsem se docetl ze na takovy reseni je potreba vytvorit dalsi vlakno v wcf ktery bude zpetne data odesilat, myslim si, ze by melo existovat nejaky peknejsi a jednodussi reseni.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 7 Opera 9.80  |  [90.181.101.---]
 |   |  Microsoft Windows 7 Chrome 27.0.1453.94  |  [84.242.75.---]

Vytvoříš si vlastní třídu odvozenou od Stream, kde přetížíš metodu Read(). Vytvoříš si tam event, který budeš v přetížené metodě volat v nějakém intervalu. V klientovi si k tomu eventu zaregistruješ nějaký svůj callback - ten se ti bude pravidelně volat - na ten pak můžeš navěsit nějaký progress. Více třeba zde:http://www.codeproject.com/Articles/20364/Progress-I...

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 8 Chrome 27.0.1453.94  |  [91.219.245.---]

konecne jsem se dostal k tomu abych poradne vyzkousel jak to funguje a funguje to naprosto perfektne, teda je super, ze uz neni pri vstupu souboru potreba alokovat mnozstvi pameti na celej soubor ani pri prubehu streamu, nicmene jsem dosel k zjisteni, ze i tak pri streamovani je potreba nejaka (nezanedbatelna) pamet + cpu, na mym pc jde o cca 10-20% cpu + 0.5GB ram (vicemene, navic po nekolika testech treba i ta ram spadla na naprosty minimum) na necely 2GB soubor cca jen tak od oka, ale to uz nemusi bejt zadnej problem, podle toho, ktera cast reseni to vyuziva, logicky by to podle me mely byt zarizeni, mezi kteryma se streamuje tzn klient + server (wcf), web jako prostrednik by na tom mel byt lip, nebo co myslite vy? Zkousel jsem streamovani hodit do konzolovy aplikace a poslat soubor na lokalni wcf aplikaci, abych mohl v task manageru oddelit klienta od wcf aplikace, z toho mi vyslo ze procesor zralo wcf (iis), konzolova aplikace jela na max par %, ale nepodarilo se mi zjistit jak je to s operacni pameti, rad bych v tomhle mel jistotu, kdyz uz na tom budu dal stavet. To, proc to takhle resim je, ze mam nekolik serveru, ktery bych rad mel spis jako uloziste a mel separatne oddeleny web aplikaci umistenou na normalnim web hostingu (kde je i vetsi jistota, ze pobezi dal), ale hosting kterej momentalne pouzivam na web4u ma garantovano cca 200mb ram, a to uz je sakra rozdil od serveru kde mam na kazdym 16GB, nebo co me napadlo je, ze bych mel na kazdym serveru klientskou aplikaci a nejak pristup k jednolovym serverum rozhazoval mezi uzivatele aplikaci na hostingu, jo jen jeste pro upresneni, to proc mam hosting je, ze jde o levnejsi zalezitost nez umistit do data centra server a potrebuju mit centralni db, u ktere bude velka pravdepodobnost ze jen tak nespadne, precejen hosting nejaky technicky problemy resi sam. Diky za vsechny rady, Jan

Souhlasím  |  Nesouhlasím  |  Odpovědět

Související témata: 10, File, Filename, Form, Label



Určitě si přečtěte