Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Access baza i memorija

[es] :: Visual Basic 6 :: Access baza i memorija

[ Pregleda: 3398 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.static.isp.telekom.rs.



+322 Profil

icon Access baza i memorija26.11.2010. u 13:06 - pre 162 meseci
Imam problem sa manjkom iskustva vezano za baze podataka. Pronasao sam na ovom forumu primere kako se radi sa bazama i taman kad sam se osilio kako ja to znam dosao sam do problema. Naime, sve lepo radi dok se baza ne napuni do odredjenog nivoa a tada mi izbacuje gresku da nemam vise RAM memorije.

Code:

Private WithEvents Cn As ADODB.Connection
Private WithEvents rsRecordSet As ADODB.Recordset
Private WithEvents rstempcode As ADODB.Recordset

Private Sub Command1_Click()
   Set Cn = New ADODB.Connection
   Cn.CursorLocation = adUseClient
   Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=c:\Baza.mdb"
   Set rsRecordSet = New ADODB.Recordset
   rsRecordSet.Open "SELECT * FROM Kombinacije1 ", Cn, adOpenStatic, adLockOptimistic

For i = 1 To 500
    zbir = 4
    strString = "Test"
    rsRecordSet.AddNew
    rsRecordSet!ZbirBrojeva = Str(zbir)
    rsRecordSet!Brojevi = strString
    strString = ""
    rsRecordSet.Update
Next i
rsRecordSet.Close
MsgBox ("Gotojoo")
End Sub


Mesto na kome dolazi do preblema je:

Code:
 rsRecordSet.Open "SELECT * FROM Kombinacije1 ", Cn, adOpenStatic, adLockOptimistic


Kod gore pomenue linije on počinje da učitava sve zapise u bazi (tako makar ja to razumem) i puni memoriju, puni puni dok je ne popuni celu i izbaci grešku. E sad ili ja imam neki propust ili Access možda tako radi, to ne znam. Jednostavno kada dodje do 7.000.000 zapisa pukne zbog manjaka memorije.

Ima li neko rešenje?
 
Odgovor na temu

loto17

Član broj: 184930
Poruke: 110
*.ptt.rs.



+4 Profil

icon Re: Access baza i memorija26.11.2010. u 14:16 - pre 162 meseci
Koju gresku izbaci?
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.static.isp.telekom.rs.



+322 Profil

icon Re: Access baza i memorija26.11.2010. u 14:46 - pre 162 meseci
Pa kao sto vec rekoh nema memorije (Out of memory). Sigurno je to, pratim ja memoriju. Kada dodje do gore pomenute linije program krene da povećava memoriju od 0 do nekih 2GB i tu pukne jer nema više RAM-a a pretpostavljam da se to nekako može sprečiti.

EDIT
Hajde ljudi pomooooc! Nema sanse da ovde nema profesionalnih programera. Kako da otvorim bazu tako da upisujem zapis po zapis i takodje kako da citam zapis po zapis? Kako ja shvatam rsRecordSet.Open "SELECT * FROM Kombinacije1 ", Cn, adOpenStatic, adLockOptimistic ce mi u rsrecordset ubaciti sve zapise iz baze i zato se to desi ali to ne zellim.

[Ovu poruku je menjao Blue82 dana 26.11.2010. u 16:08 GMT+1]
 
Odgovor na temu

vuchko.vuchko

Član broj: 217112
Poruke: 301
*.teol.net.



+2 Profil

icon Re: Access baza i memorija27.11.2010. u 01:19 - pre 162 meseci
Pa sta ti zelis??? Da citas zapis po zapis i da ga provjeravas ili da otvoris samo jedan, tacno odredjeni zapis od 7 000 000 zapisa?
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-1.sezampro.yu.



+322 Profil

icon Re: Access baza i memorija27.11.2010. u 06:16 - pre 162 meseci
Da upisujem i posle citam jedan po jedan zapis. Nije mi potrebna "pomoc" Accessa u brzoj pretrazi i svojim funkcijama, ja svakako mora proci kroz svaki zapis od pocetka do kraja a kako je kolicina podataka preko sest miliona zapisa u jednoj tabeli pa jos toliko zapisa u drugoj tabeli RAM pukne jer 2GB je malo a i potpuno je glupo na taj nacin trositi RAM sve i da neko ima 10GB pa da kaze da ga bas briga.

Mislim da neko resenje imam a to je da jednu tabelu razbijem na vise manjih i to bi trebalo da radi, samo to je onako.. ko uz pomoc stapa i kanapa, radilo bi ali programski bi bilo vrlo smesno a pretpostavljam da ima elegantno resenje.
 
Odgovor na temu

loto17

Član broj: 184930
Poruke: 110
*.ptt.rs.



+4 Profil

icon Re: Access baza i memorija27.11.2010. u 10:11 - pre 162 meseci
Ovo bi moralo da radi bez obzira koliko ima zapisa u bazi.

Code:

Option Explicit
Dim conn As ADODB.Connection, rec As ADODB.Recordset
Dim esql As String

Private Sub Command1_Click()
Set conn = New ADODB.Connection
Set rec = New ADODB.Recordset
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Baza.mdb;Persist Security Info=False"
conn.Open
esql = "SELECT * from Kombinacije1"
rec.Open (esql), conn, adOpenDynamic, adLockOptimistic

End Sub

Private Sub Form_Unload(Cancel As Integer)
rec.Close
conn.Close
Set conn = Nothing
End Sub

 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-1.sezampro.yu.



+322 Profil

icon Re: Access baza i memorija27.11.2010. u 16:29 - pre 162 meseci
Code:
rec.Open (esql), conn, adOpenDynamic, adLockOptimistic


Ovo se ni po cemu ne razlikuje od mog primera osim sto si drugacije nazvao promenjive :D

Uspeo sam da resim problem na zaobilazni nacin (programski ne lep). Ubacio sam u tabelu kljuc koji ce biti redni broj zapisa. Onda prvo ucitam prvih milion zapisa pa pregledam pa ucitam drugih milion pa pregledam itd. Radi ali verovao sam da ima elegantnije resenje. Ovako je program nepregledan. Bljak :D
 
Odgovor na temu

Marko_L
Beograd

Član broj: 20532
Poruke: 2885
*.dynamic.sbb.rs.

Jabber: Marko_L@elitesecurity.org


+828 Profil

icon Re: Access baza i memorija28.11.2010. u 17:52 - pre 162 meseci
Kada se radi sa tabelom od više miliona zapisa, pogotovo ako neke kolone sadrže kompletne fajlove, stringove neograničene dužine i šta se već sve može potrpati u bazu... uvek se pristupa selektivnom prikazivanju podataka, jer prikazivanje svih rekorda jednostavno nema smisla. Mislim, gde ćeš uopšte da ih prikažeš. Na jedan ekran svakako ne mogu da stanu. Na stranu što će ti za učitavanje takvog rekordseta trebati par sati. A i ko će ikada želeti da pregleda svih par miliona zapisa odjednom. Obično se podaci prikazuj po određenom kriterijumu, recimo raspon datuma ili samo za određenog klijenta ili samo za određeni artikl ili šta već praviš, a to će spustiti broj rekorda na prihvatljivih par stotina ili par hiljada redova. Tamo gde postoji potreba za prikazivanje više miliona redova, obično se koriste super-računari. U svakom slučaju, to što si uradio nije programerski ne lep način (šta god to značilo), već upravo ispravan pristup. Naravno da svaki red u tabeli treba da ima svoj ID broj, iz raznoraznih razloga i naravno da u slučaju postojanja velikog broja podataka ne treba sve odjednom ubacivati u rekordset, već samo one sa kojima trebaš nešto da uradiš. Neki to rade i sa manje podataka... i to je uvek dobra praksa jer će svakako ubrzati izvođenje. Čak i da imaš svega 1000 redova u bazi, zašto bi izlistavao svih hiljadu ako ti treba samo stotinak redova, recimo onih koje hoćeš da prikažeš u nekom gridu ili tako nešto.
-Odracuonogakomijedrpiorazmaknicu.
-Ne rxdi mi txstxturx, kxd god hocu dx
ukucxm "x" onx ukucx "x".
-Ko kaaz e da ja neuummem da kuuca
m.
-Piše "Insert disk 3", a jedva sam i ova
dva ugurao u drajv
-Postoje samo dve osobe kojima
verujem, jedna sam ja, a druga nisi ti
 
Odgovor na temu

izonic
ishab zonic
Tuzla

Član broj: 38128
Poruke: 591
89.146.162.*

Sajt: www.icentar.ba


+2 Profil

icon Re: Access baza i memorija28.11.2010. u 21:18 - pre 162 meseci
Nije mi jas no zasto podiszes tolike recordsetove kada vrsis samo unos podataka.
Mogao si koristiti INSERT INTO
Ovo mozas zakrpati:

Code:
Private WithEvents Cn As ADODB.Connection
Private WithEvents rsRecordSet As ADODB.Recordset

Private Sub Command1_Click()
   Set Cn = New ADODB.Connection
   Cn.CursorLocation = adUseClient
   Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=c:\Baza.mdb"
   Set rsRecordSet = New ADODB.Recordset
   rsRecordSet.Open "SELECT * FROM Kombinacije1 WHERE false<>False", Cn, adOpenStatic, adLockOptimistic

For i = 1 To 500
    zbir = 4
    strString = "Test"
    rsRecordSet.AddNew
    rsRecordSet!ZbirBrojeva = Str(zbir)
    rsRecordSet!Brojevi = strString
    strString = ""
    rsRecordSet.Update
Next i
rsRecordSet.Close
MsgBox ("Gotojoo")
End Sub

zxz
 
Odgovor na temu

Blue82
dipl. ecc.

Član broj: 165981
Poruke: 838
*.adsl-a-5.sezampro.rs.



+322 Profil

icon Re: Access baza i memorija28.11.2010. u 22:03 - pre 162 meseci
To je ustvari aplikacija koja obavlja veliki broj proracuna na osnovu unetih parametara (brojevi). I jedna od stvari je da napravi sve moguce kombinacije bez ponavljanja od datih brojeva. A ako na ulasku imamo samo 25 brojeva, kao rezultat dobijamo par miliona kombinacija, a kada se kombinatorika racuna na osnovu 50-100 brojeva ode sve u nebesa.
Baza je tu samo da bih zapamtila sve kombinacije i resenja koja se dobijaju na osnovu te kombinatorike (posto sve ne moze da stane u RAM), onda napravi isto takav proracun za drugi set brojeva i sve to zapamti da bih posle toga poceo da uparuje resenja iz te dve baze i izvlacio odredjene zakonitosti i odstupanja.

Sa bazom nemam neko ogromno iskustvo, tj znam osnovni princip rada i nikada do sada nisam imao tabelu sa vise od par hiljada unosa pa nisam ni znao da mi princip nije ispravan, dok mi sada nije iskocio ovaj problem.

Sto se tice kriterijuma za pretragu ovde ga nema jer svaki broj iz prve tabele mora da se uporedi sa svakim brojem iz druge tabele. Al ajd, uz malo mozganja resih to na meni zakukuljen, ispostavilo se logican nacin :) Pretpostavljao sam da postoji neka komanda tipa citaj zapis po zapis pa sam zato pitao.
 
Odgovor na temu

izonic
ishab zonic
Tuzla

Član broj: 38128
Poruke: 591
89.146.172.*

Sajt: www.icentar.ba


+2 Profil

icon Re: Access baza i memorija29.11.2010. u 09:59 - pre 162 meseci
Code:
Private WithEvents Cn As ADODB.Connection
Private WithEvents rsRecordSet As ADODB.Recordset

Private Sub Command1_Click()
   Set Cn = New ADODB.Connection
   Cn.CursorLocation = adUseClient
   Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=c:\Baza.mdb"
   Set rsRecordSet = New ADODB.Recordset
   rsRecordSet.Open "SELECT * FROM Kombinacije1 WHERE false<>False", Cn, adOpenStatic, adLockOptimistic

For i = 1 To 500
    zbir = 4
    strString = "Test"
    rsRecordSet.AddNew
    rsRecordSet!ZbirBrojeva = Str(zbir)
    rsRecordSet!Brojevi = strString
    strString = ""
    rsRecordSet.Update
Next i
rsRecordSet.Close
MsgBox ("Gotojoo")
End Sub


U tvome primjeru (a vjerovatno je samo primjer) vidi se da podizes cijelu tabelu sa svim vec upisanim Rs. a u daljem kodu to ne koristis.
Dali ti to treba ne znam.
Ako netreba onda mozes naisati SQL ovakav:
"SELECT * FROM Kombinacije1 WHERE false<>False"
Ako stavimo uslov False<>False onda nece podici niti jedan red iz tabele sto znaci neces time napuniti memoriju.
For i= 1 to 500--Govori da ces upisati 500 redova u tabelu prije no sto je zatvoris i to mije puno za memoriju
rsRecordSet.Close

I to bi po meni bila zakrpa.

Ispravno bi bilo (naravno opet kazem ako ne koristis upisane redove u bazi kao sto je navedeno)


Code:

Private WithEvents Cn As ADODB.Connection

Private Sub Command1_Click()
   Set Cn = New ADODB.Connection
   Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=c:\Baza.mdb"
For i = 1 To 500
    zbir = 4
    strString = "Test"
   Cn.Execute "INSERT INTO Kombinacije1 (ZbirBrojeva, Brojevi) SELECT '" & zbir & "','"  & strString & "'"
Next i
Set Cn = Nothing
MsgBox ("Gotojoo")
End Sub


Nadam se da sam pomogao.

zxz
 
Odgovor na temu

vuchko.vuchko

Član broj: 217112
Poruke: 301
*.teol.net.



+2 Profil

icon Re: Access baza i memorija29.11.2010. u 11:17 - pre 162 meseci
Pratim ovu temu i nikako ne razumijem...

Citat:
Sto se tice kriterijuma za pretragu ovde ga nema jer svaki broj iz prve tabele mora da se uporedi sa svakim brojem iz druge tabele. Al ajd, uz malo mozganja resih to na meni zakukuljen, ispostavilo se logican nacin Pretpostavljao sam da postoji neka komanda tipa citaj zapis po zapis pa sam zato pitao.


Kako ne postoji komanda koja bi to radila, stvar je samo u logici, a i u potrebnom vremenu. evo npr.

Ovo je vise neki pseudo kod (logika kojom treba raditi)

Code:
Data1.Database ("c:/baza.mdb")  ' kad postavis pokazivac na koju bazu da se konektuje
Data1.Recordset.OpenRecordset ("Brojevi")  ' kad povezes recordset i svoju tablu zapisa
Data1.Recordset.MoveFirst  ' tad postavis recordset na prvi zapis

While Data1.Recordset.EOF = False 'i dok god nisi stigao do zadnjeg zapisa provjeravas....
NekiBroj = Data1.Recordset.Fields(1).Value ' preuzimas vrijednosti polja iz prvog zapisa
Call Ispitaj(NekiBroj) ' vrsis potrebna ispitivanja 
Data1.Recordset.MoveNext ' potom pomjeris na sledeci zapis i opet sve ispocetka
Wend


@Blue82
Znaci ovo je samo logika kojom se treba voditi, nemoj me bukvalno svatiti (kao u onoj temi remaining time problem)
 
Odgovor na temu

dava
Banja Luka

Član broj: 27208
Poruke: 893



+384 Profil

icon Re: Access baza i memorija02.12.2010. u 11:08 - pre 162 meseci
Mogao bi pre unosa broja u prvu tabelu, postojanje broja provjeriti tako što ćeš pozivati komandu:

Code:
SELECT * from Kombinacije1 WHERE BROJ = 'n'
(gdje je 'n' konkretan broj)
i ako se vrati prazan rs znači nema tog broja. Ovaj način je spor jer se svaki zapis/broj čita sa diska.

Mnogo brže je sve strpati u memoriju i tu provjeravati, baš tako što si ti pokušao, s tim što si učitao čitav slog iz tabele 'select * from' umjesto 'select broj from' (ovde predpostavljam slog/red ima više polja).
Nisi napisao, ti brojevi u kom su opsegu? Kojeg je tipa polje u bazi? Kako provjeravaš, po jednom polju ili više njih?
SELECT * FROM หน่วยงานหลัก WHERE ยสันติ LIKE 'โดย%'
 
Odgovor na temu

dzigilibonglica
NS

Član broj: 200040
Poruke: 294



+17 Profil

icon Re: Access baza i memorija09.12.2010. u 23:13 - pre 161 meseci
Sve sto su ti ljudi do sada rekli je 100% tako, a ja cu jos malo da razjasnim...

Problemi su i Hardverski i softwerski!

1) access baze .mdb koriste JET mashinu (engine), koji je u ovom slucaju fajl sistem, a ne pravi server. Ogranicenja fajl sistema su prilicna, i jet mashina ne ide dalje od toga. Ako imash dosta memorije, a koristish JET engine, dzaba ti i memorija. Predji na ne sto drugo (MS SQL Server,Oracle, ili MySql), bolje ova prva dva, u siroj su upotrebi u koorporativnom svetu za koji se software i radi..., a postoje i Expres verzije do 4GB koje rade sasvim dobro, i pravi su serveri.

Znaci, prvo treba da imash hardver dovoljno "jak", a tek onda ide software, odnosno baza. Access iliti JET/.Mdb sa velikim tabelama jednostavno ne pije vodu.
Prost primer: Tabela od 300K redova, probaj da promenish iz Access-a Kolonu tipa Long u Text. Ne ide.

2) To sto ucitavash celu tabelu, da bi doddao red, to se ne radi tako, lepo su ljudi rekli radi INSERT INTO i to ce ti raditi.
A ako bas morash tako, radi
SELECT * FROM NekaTebela WHERE NekaTvojaPromenjivaID=-1 gde nema sanse da NekaTvojaPromenjivaID bude -1, ali i to je jako sporo,.

3) A ako ti bas treba da iscitavas vrednosti 7M redova i nesto radish sa njima, imash dve solucije:
a) Jak hardver (brz processor i puuno memorije) i Pravi server
b) Citaj deo po deo iz tabele, na osnovu SELECT MAX(NekaTvojaPromenjivaID) pa onda radi selecte deo po deo od vrednosti MAX. Sve se to da nabudziti ako se bas mora :)

4) Preko 2GB Access baza ce ti vracati na upit sledece: 1)Gresku, 2) Nepredvidiv rezultat, 3) Krah sistema.


A kasnije kada bude vise aplikacija koje trce po istoj bazi, a ona veeelika...?
E to je onda sex sa Access bazama....
 
Odgovor na temu

[es] :: Visual Basic 6 :: Access baza i memorija

[ Pregleda: 3398 | Odgovora: 13 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.