Ve webové aplikaci, vytvořené VS 2008 - VB.NET, bych rád zpracoval textový
soubor. Cílem je načíst txt soubor ze zvoleného umístění na disku, každý
řádek rozkódovat a uložit do databáze. Celý kód už mi funguje, ale problém je
v tom, že ten texťák má třeba i 1,2 MB a jeho celé zpracování je časově dost
náročné a do dokončení procesu totálně zablokuje prohlížet klienta. Má
představa je po stisku buttonu u klienta předat serveru jen informaci o
umístění souboru, server začne proces nyní sám nezávisle na klientovi
zpracovávat, klient se automaticky např. každých 5 s dotáže serveru, jestli
už je uloha zpracovaná a až je úloha dokončena, změní se samo na stránce
klienta např. label nebo hypertextový odkaz nebo jejich vlastnosti enabled
apod. Ten samý princip používá např. aplikace pro dálkový přístup do katastru
nemovitostí nebo web pro odesílání souborů ISP.XML.
Děkuji za tipy
pokud píšete webovou aplikaci v ASP.NET, tak musíte soubor uploadovat na
server (obecně web server nemůže sáhnout na klienta a načíst soubor na jeho
disku - to by byla pěkná bezpečnostní díra).
Pomocí standardních prostředků ASP.NET toto nijak neurychlíte. Existují
řešení, komponenty, která narozdíl od standardního umožní třeba zobrazovat
asynchronně průběh uploadu (třeba od Teleriku - www.telerik.com), ale u 1 MB
souboru je to myslím celkem zbytečné.
Asynchronní zpracování na serveru možné je, ale obávám se, že to není řešení
vhodné pro začátečníka, za kterého jste se sám označil. Pokud má datový
soubor "až" 1.2 MB a jde jenom o nasypání dat do databáze, pak patrně děláte
něco špatně při zpracování. Ten objem dat je tak malý, že pokud s ním
neděláte něco opravdu příšerného, měl by se naimportovat velice rychle.
--
Michal Altair Valášek | Microsoft ASP.NET MVP
Chief Software Architect | Altairis, s. r. o.
www.aspnet.cz | www.rider.cz | www.altairis.cz
"MARTIN O." <MAR...@discussions.microsoft.com> wrote in message
news:C0042D5C-679C-4603...@microsoft.com...
pouze načtení textového souboru do DB není problém, ale jeho následné
zpracování do tvaru databáze už ano. Protože v něm nejsou žádné oddělovače,
musím jednotlivé údaje vytahovat pomocí příkazů MID, zjišťovat absolutní
pozici záznamu, vracet se na ni apod. Tato operace mi trvá na běžném PC v
Accessu třeba 1 min. a pokud by na tuto dobu "zatuhl" prohlížeč klienta,
vidím v tom problém a líbila se mi představa, že by se ten soubor jen poslal
na server, klient by měl volný prohlížeč na další práci a po nějaké době by
se na stránce klienta objevila informace, že operace je dokončena. Výsledná
informace by mohla mít různou podobu - visible, enabled, aktivní hypertext
apod.
Děkuji za další tipy
"Michal Altair Valasek" wrote:
> .
>
Přiznám se, že nevím, co jsou to příkazy MID, ale google mi říká něco o
nějaké metodě MS Office - pokud tvoříte aplikaci pod ASP.NET, proč
nepoužíváte výhradně C#? Nemůže být pomalost právě díky tomuto?
Pokud máte na serveru přístup, řešil bych to tak, že soubor uploadnete
na server do TMP tabulky. Na serveru pobeží nějaká win. služba, která si
každých x sekund zjistí, jestli není něco ke zpracování a pokud ano -
zpracuje. Při uploadu můžete klientovi vrátit nějaký indetifikátor,
takže mu můžete na nějaké stránce zobrazovat jaký je aktuální stav
zpracování - ne úplně v reálném čase, ale to si myslím, na webu nikdo
neočekává. Problém nastane, pokud se to zpracování nepovede...
Vašek
MARTIN O. napsal(a):
protože do programování jsem se dostal přes MS Access a teď se snažím své
pomocné aplikace předělávat do ASP.NET, je mi bližší jazyk vb.net než C#.
Příkazy předpokládám, že jsou +/- stejné rychlé v obou jazycích ....... ?
Textový soubor vypadá asi takto:
5/@002945690001000MU
6/@00294569001200 2 2009
C/@01000003000315800000000000000000000002119000 000000000018353600
C/$0001000003prodej budovy trafostanice a pozemku
C/@010000030002351000361231120000000000021190000018353600 00000000
C/$0002000003prodej budovy trafostanice a pozemku
C/#0001000003*IC-27232425;*DIC-CZ27232425;*DICT-ČEZ Distribuce, a. s.;
C/#0002000003*EVK-KOF-2009KOF2009000033;*PID-MUX00F3D56;
V Accessu jsem ten soubor importovat do jednosloupcové tabulky a následně
jsem z něj vytahoval jednotlivé informace. Načetl jsem větu, která když
začínala C/@, věděl jsem, že 6-12 pozice je číslo účetního dokladu, tedy před
příkaz qCISLO=MID(veta,6,6) jsem získal jeden údaj, další pozice jsou účetní
konta, částky, popisy apod.
Právě vytažení všech údajů a jejich uložení do klasické databáze, kde je
každý údaj v jednom sloupci, trvá podle počtu obratů daného měsíce 1-2 minuty.
Cílem je nyní u klienta, aby odeslal na server jednotlivé měsíce (txt
soubory), ty se tam zpracovaly a uložili do databáze už rozklíčené a po
zpracování mohl klient z DB vytahovat přes SQL dotazy požadované informace a
sestavy.
Přístup na server mám, ale nejraději bych vše řešil v rámci jedné aplikace.
Jako příklad jsem uváděl generování listu vlastnictví přes dálkový přístup
do katastru - tam se také jen zadají údaje pro vygenerování souboru,
prohlížeč je odešle a co 5 sekund se provede refresh s tím, že jakmile je
soubor na serveru dostupný, zpřístupní se link na pdf soubor.
Děkuji
""Ing. Václav Nauš"" wrote:
> .
>
To co popisujete dělá obnovení stránky po určité době dokud není připravený požadovaný soubor. O průběhu zpracování to nejspíš neví nic. K obnově stránky vám stačí tag
<meta http-equiv="refresh" content="600">
Případně můžete použít AJAX a tu obnovu stavu dělat jen v části stránky.
Dne 21.1.2010 15:13, MARTIN O. napsal(a):
Toto jsem nabízel já, jako alernativu asynchronního zpracování.
> Víte co na zpracování trvá tak dlouho? Nedá se to zrychlit?
Na soubor s podobně danou strukturou - věty s danou délkou jednotlivých
záznamů, jsme si psali parser a prolém s rychlostí parsování jsme neměli
(sice ty soubory byly max. 0,5MB...). Není problém spíše s rychlostí
uložení jedné "faktury" do DB?
Obecně:
V organizaci je účetní systém. Protože potřebuji vytvářet vlastní sestavy,
chci si vytvořit vlastní aplikaci (dnes řešeno v MS Access), do které se
nahrají účetní data. Jediný možný výstup z účetního IS je textový soubor, ve
kterém jsou všechny účetní obraty zvoleného měsíce. Kdyby byly uloženy jako
dbf, xls, xml apod - není co řešit. Problém ale je, že jsou v "zašifrovaném"
tvaru a musí se do tvaru databáze teprve převést - viz předchozí příspěvky.
Konkrétní otázky:
1. Jak nastavit button, aby po stisku jen odeslal na server informaci o
umístění souboru na serveru a současně tento button spustil nějakou proceduru
na serveru, ale na její provádění už by klient nečekal. Současně button
spustí refresh u klienta - viz níže.
2. Když server proceduru dokončí, uloží do nějaké proměnné údaj, že je hotovo.
3. Jak nastavit refresh na stránce, aby při obnovení si klient načetl obsah
proměnné a když bude rovna true, tak změní label na stránce klienta na
text="Hotovo" a refresh se už vypne.
Díky za trpělivost
""Ing. Václav Nauš"" wrote:
> .
>
MARTIN O. napsal(a):
> Asi se pořád neumím vyjádřit ..... :-)
>
> Obecně:
> V organizaci je účetní systém. Protože potřebuji vytvářet vlastní sestavy,
> chci si vytvořit vlastní aplikaci (dnes řešeno v MS Access), do které se
> nahrají účetní data. Jediný možný výstup z účetního IS je textový soubor, ve
> kterém jsou všechny účetní obraty zvoleného měsíce. Kdyby byly uloženy jako
> dbf, xls, xml apod - není co řešit. Problém ale je, že jsou v "zašifrovaném"
> tvaru a musí se do tvaru databáze teprve převést - viz předchozí příspěvky.
>
> Konkrétní otázky:
> 1. Jak nastavit button, aby po stisku jen odeslal na server informaci o
> umístění souboru na serveru a současně tento button spustil nějakou proceduru
> na serveru, ale na její provádění už by klient nečekal. Současně button
> spustí refresh u klienta - viz níže.
- Button nemuze vedet o umisteni souboru nic. Musi tam byt nejaky
vstupni radek (<INPUT TYPE="TEXT" ...>) do ktereho cestu k souboru ulozite.
- Musite pred spustenim prevodni procedury vratit stranku na klienta
obsahujici kod na opakovane volani (refres) jine stranky, ktera bude
cekat na tu vasi "promennou" (treba existenci nejakeho zaznamu v databazi)
>
> 2. Když server proceduru dokončí, uloží do nějaké proměnné údaj, že je hotovo.
>
> 3. Jak nastavit refresh na stránce, aby při obnovení si klient načetl obsah
> proměnné a když bude rovna true, tak změní label na stránce klienta na
> text="Hotovo" a refresh se už vypne.
- na strane klienta to neudelate. Musite to delat na strane serveru
opakovanym vracenim stranky jestli cekame dal nebo je uz vse OK (treba
po 5 sekundach)
Na začátek se ještě zeptám. Ten účetní systém vytvoří soubor na serveru a web k němu bude mít tedy přístup bez toho, že by se musel uploadovat?
A druhá otázka, vyžaduje se, aby v jednom okamžiku tuto službu využívalo víc lidí? Asi ne, nebo se mýlím?
Jestli platí co jsem napsal, tak to tlačítko pro spuštění je v podstatě k ničemu, protože stačí požadavek na načtení stránky. Stránka musí poznat jestli zpracování probíhá a pak může fungovat poměrně jednoduše. Při požadavku na stránku se provedou následující kroky:
1. zkontroluje se, jestli probíhá zpracování. Pokud ano, tak se vrátí informace o tom, že se zpracovává a nastaví se čas pro refresh stránky (to už bylo výš popsané)
2. pokud neprobíhá, tak se zkontroluje, jestli je připravený soubor pro zpracování a pokud ano, tak se spustí zpracování (musí se to spustit jako samostatný proces na serveru)
3. pokud neprobíhá a není nový soubor ke zpracování, tak se zkontroluje existence zpracovaného výsledku a ten se vrátí.
No a ve zjednodušené podobě to pak může fungovat tak, že nový soubor se se začátkem zpracování přejmenuje na např. Zpracovani.txt a podle existence takového souboru se pozná, jestli zpracování běží. Pak ještě budete řešit co když dojde k pádu aplikace pro zpracování ....
Jako lepší variantu bych viděl použít AJAX
http://www.asp.net/AJAX/AjaxControlToolkit/Samples/DynamicPopulate/DynamicPopulate.aspx
Stránka pak budeobsahovat dynamickou část, která se naplní po dokončení zpracování.
Dne 25.1.2010 17:56, MARTIN O. napsal(a):
"P.L." wrote:
> Jestli tomu dobře rozumím, tak děláte takové udělátko, které by jako samostatný web nemohlo fungovat. Otázka tedy je, jestli volíte správné nástroje. Druhá otázka je, jestli důvodem špatné realizace není dlouhé zpracování a jestli by nebylo lepší vynaložit síly na optimalizaci než na nějaké berličky. Ptal jsem se, jestli víte proč je to tak pomalé, ale asi s tím nic dělat nechcete :o(
Je fakt, že ten svůj kód v accessu už mám někdy z roku 2003 a dnes bych
některé postupy volil jinak (if... then ...end if nebo do case apod.) Také
předpokládám, že když to budu nyní předělávat do asp.net, že to zkusím trochu
zoptimalizovat.
>
> Na začátek se ještě zeptám. Ten účetní systém vytvoří soubor na serveru a web k němu bude mít tedy přístup bez toho, že by se musel uploadovat?
Přesně tak!
Vše je řešeno v rámci intranetu.
Problém je v tom, že každý měsíc má svůj vlastní název. Dal by se ale
používat stejný, protože údaj o tom jaký měsíc a rok je zpracováván je uložen
přímo v souboru (dřív jsem to ukládal zvlášť, abych zachoval soubory, které
jsem importoval)
>
> A druhá otázka, vyžaduje se, aby v jednom okamžiku tuto službu využívalo víc lidí? Asi ne, nebo se mýlím?
Aktualizaci by mohli dělat max. 2 lidi, ale pro zjednodušení to asi nechám
dělat jen jednoho (přes práva admina apod.)
>
> Jestli platí co jsem napsal, tak to tlačítko pro spuštění je v podstatě k ničemu, protože stačí požadavek na načtení stránky. Stránka musí poznat jestli zpracování probíhá a pak může fungovat poměrně jednoduše. Při požadavku na stránku se provedou následující kroky:
>
> 1. zkontroluje se, jestli probíhá zpracování. Pokud ano, tak se vrátí informace o tom, že se zpracovává a nastaví se čas pro refresh stránky (to už bylo výš popsané)
(to už bylo výš popsané)
Myslíte tím TAGem? <meta http-equiv="refresh" content="600">
Ten dokážu dát přímo do aspx stránky při návrhu.
Jak ho do stránky ale vložit při události page_load?
> 2. pokud neprobíhá, tak se zkontroluje, jestli je připravený soubor pro zpracování a pokud ano, tak se spustí zpracování (musí se to spustit jako samostatný proces na serveru)
Jak se to prosím spustí na serveru jako samostatný proces?
> 3. pokud neprobíhá a není nový soubor ke zpracování, tak se zkontroluje existence zpracovaného výsledku a ten se vrátí.
>
>
> No a ve zjednodušené podobě to pak může fungovat tak, že nový soubor se se začátkem zpracování přejmenuje na např. Zpracovani.txt a podle existence takového souboru se pozná, jestli zpracování běží. Pak ještě budete řešit co když dojde k pádu aplikace pro zpracování ....
>
>
> Jako lepší variantu bych viděl použít AJAX
>
> http://www.asp.net/AJAX/AjaxControlToolkit/Samples/DynamicPopulate/DynamicPopulate.aspx
>
> Stránka pak budeobsahovat dynamickou část, která se naplní po dokončení zpracování.
>
Vaše řešení je přesně to, co hledám!
Ten Ajax se mi líbí a zkusím si k němu něco stáhnout.
Bude ale trvat delší dobu než najdu chvilku a prokoušu se tím.
Zatím jste se nejvíc přiblížil mojí představě.
Díky za odpovědi.
M.O.
> .
>
Pro předávání informací (progress) mezi tím threadem a stránkou zobrazující
postup použijte nějaké globální uložiště, třeba globální statickou
proměnnou.
Robert Haken [MVP ASP.NET, MCPD, MCT]
HAVIT, s.r.o. [http://knowledge-base.havit.cz]
"MARTIN O." <MAR...@discussions.microsoft.com> píše v diskusním příspěvku
news:AA9E10B7-8802-42A4...@microsoft.com...