OVH Cloud OVH Cloud

tableau dynamique ou collection

16 réponses
Avatar
TouTenN
Bonjour

J'aimerais avec votre avis...

Je dois gérer de nombreuses lignes de valeurs que je dois manipuler.

J'ai essayé avec les tableaux à plusieurs dimensions table(50000, 20)

malheureusement le temps de traitement (d'accés et d'écriture des données)
est très long.

En faisant quelques recherches, j'ai remarqué qu'il existait d'autres
méthodes pour gérer des valeurs : Les tableaux Dynamiques et les
Collections.

Auriez-vous des informations, remarques de rapidité entre les 2 méthodes,
sources, liens... pour que je puisse les étudier

Merci

Guy

--

10 réponses

1 2
Avatar
Zoury
Quels sont les données qui doivent être conservé en mémoire vive?

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
"TouTenN" <gelapplication[Nospam]@tiscali.fr> wrote in message
news:bmovj1$ojo$
Bonjour

J'aimerais avec votre avis...

Je dois gérer de nombreuses lignes de valeurs que je dois manipuler.

J'ai essayé avec les tableaux à plusieurs dimensions table(50000, 20)

malheureusement le temps de traitement (d'accés et d'écriture des données)
est très long.

En faisant quelques recherches, j'ai remarqué qu'il existait d'autres
méthodes pour gérer des valeurs : Les tableaux Dynamiques et les
Collections.

Auriez-vous des informations, remarques de rapidité entre les 2 méthodes,
sources, liens... pour que je puisse les étudier

Merci

Guy

--





Avatar
GuY - TouTenN
> Quels sont les données qui doivent être conservé en mémoire vive?


pour chaque ligne d'information, je dois avoir 20 données de tous types
(principalement string*5, integer)
je peux avoir chaqu'à 50000 lignes d'informations

J'ai regardé une petit source sur les collections, puis-je avoir des
indexes(clés) qui ne se suivent pas ex : 1,2, 125, 126,127, 540...

merci
--
Guy-TouTenN

|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|
http://le.train.digital.free.fr

|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|
Avatar
GuY - TouTenN
> Quels sont les données qui doivent être conservé en mémoire vive?


pour chaque ligne d'information, je dois avoir 20 données de tous types
(principalement string*5, integer)
je peux avoir chaqu'à 50000 lignes d'informations

J'ai regardé une petit source sur les collections, puis-je avoir des
indexes(clés) qui ne se suivent pas ex : 1,2, 125, 126,127, 540...

merci
--
Guy-TouTenN

|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|
http://le.train.digital.free.fr

|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|
Avatar
Zoury
> J'ai regardé une petit source sur les collections, puis-je avoir des
indexes(clés) qui ne se suivent pas ex : 1,2, 125, 126,127, 540..



Nope. Mais tu peux utiliser la clé pour y placer la valeur que tu désires,
tant que c'est de type String

Maintenant, 50000 enregistrements d'une vingtaine de champs chacun prenant
au maximum 10 octets par champs (String * 5 = 10 octets) tu obtiens un total
d'approximativement 10 Mo ce qui est raisonnable de nos jours. Tu pourrais
donc simplement te faire un Type ou une Classe et stocker tes objets dans
une collection.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
GuY - TouTenN
> Nope. Mais tu peux utiliser la clé pour y placer la valeur que tu désires,
tant que c'est de type String

Maintenant, 50000 enregistrements d'une vingtaine de champs chacun prenant
au maximum 10 octets par champs (String * 5 = 10 octets) tu obtiens un


total
d'approximativement 10 Mo ce qui est raisonnable de nos jours. Tu pourrais
donc simplement te faire un Type ou une Classe et stocker tes objets dans
une collection.



Je viens de faire un essai, ça passe mais le gros problème c'est l'index, il
me refuse des valeurs aléatoires (discontinues)

Puis-je realiser une recherche rapide sur une des valeurs stockées????

--
Guy-TouTenN

|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|
http://le.train.digital.free.fr

|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|
Avatar
Zoury
Tu veux dire sur une des valeurs contenus dans un des 20 champs ou toujours
sur le même champ?

L'objet collection offre une clé pour la recherche :

'***
Option Explicit

Private Sub Form_Load()

Dim c As Collection
Set c = New Collection

Call c.Add("Item 1", "1")
Call c.Add("Item 2", "2")
Call c.Add("Item 3", "3")
Call c.Add("Item 4", "4")

Debug.Print c(3) ' Retrouve l'item 3 par index (Long)
Debug.Print c("3") ' Retrouve l'item 3 par clé (String)

Call Unload(Me)

End Sub
'***


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
"GuY - TouTenN" <gelapplication[nospam]@libertysurf.fr> wrote in message
news:3f903650$0$27593$
> Nope. Mais tu peux utiliser la clé pour y placer la valeur que tu


désires,
> tant que c'est de type String
>
> Maintenant, 50000 enregistrements d'une vingtaine de champs chacun


prenant
> au maximum 10 octets par champs (String * 5 = 10 octets) tu obtiens un
total
> d'approximativement 10 Mo ce qui est raisonnable de nos jours. Tu


pourrais
> donc simplement te faire un Type ou une Classe et stocker tes objets


dans
> une collection.

Je viens de faire un essai, ça passe mais le gros problème c'est l'index,


il
me refuse des valeurs aléatoires (discontinues)

Puis-je realiser une recherche rapide sur une des valeurs stockées????

--
Guy-TouTenN

|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|
http://le.train.digital.free.fr

|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|




Avatar
GuY - TouTenN
> Tu veux dire sur une des valeurs contenus dans un des 20 champs ou


toujours
sur le même champ?



J'aimerais que cela soit toujours dans le même champ surtout que je viens de
voir que l'on pouvait identifier une clé autre que position object.Add
item, key

Manque de bol (du a mon ignorance) dans l'appli que j'ai, il me la refuse
car la clé de position est déjà associée

j'ai rajouté dans la fonction add, une clé appelée "keyis" mais ça coince au
moment de l' add (voir en dessous)

Je peux t'envoyer le projet d'essai si tu le veux...

Merci


*****module de class carnets*****

Private mCol As Collection
'initialisation
Private Sub class_initialize()
Set mCol = New Collection
End Sub

'méthode add
Public Function add(keyis, ByVal nom As String, ByVal prenom As String,
ByVal adr As String _
, ByVal rue As String, ByVal cp As Long, ByVal vil As String, ByVal reg As
String)
Dim myObj As carnet
Set myObj = New carnet
'--------------------
myObj.nom = nom
myObj.prenom = prenom
myObj.adr = adr
myObj.rue = rue
myObj.cp = cp
myObj.vil = vil
myObj.reg = reg
'--------------------
mCol.add myObj '<<<<<<<<<<<<<<C'est ici que je coince je peux pas
rajouter la clé "mCol.add myObj ,str(keyis)
Set add = myObj
Set myObj = Nothing
'--------------------
End Function
'méthode remove
Public Sub remove(vntIndexKey As Variant)
mCol.remove vntIndexKey
End Sub
'propriété item
Public Property Get item(vntIndexKey As Variant) As carnet
Set item = mCol(vntIndexKey)
End Property
'propriété count
Public Property Get count() As Long
count = mCol.count
End Property
'prise en charge de l'énumération d'objets
Public Property Get NewEnum() As IUnknown
Set NewEnum = mCol.[_NewEnum]
End Property
'fin
'destruction de la collection
Private Sub class_terminate()
Set mCol = Nothing
End Sub


--
Guy-TouTenN

|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|
http://le.train.digital.free.fr

|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|
"Zoury" <yanick_lefebvre at hotmail dot com> a écrit dans le message de
news: OsjRB#
Tu veux dire sur une des valeurs contenus dans un des 20 champs ou


toujours
sur le même champ?

L'objet collection offre une clé pour la recherche :

'***
Option Explicit

Private Sub Form_Load()

Dim c As Collection
Set c = New Collection

Call c.Add("Item 1", "1")
Call c.Add("Item 2", "2")
Call c.Add("Item 3", "3")
Call c.Add("Item 4", "4")

Debug.Print c(3) ' Retrouve l'item 3 par index (Long)
Debug.Print c("3") ' Retrouve l'item 3 par clé (String)

Call Unload(Me)

End Sub
'***


--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
"GuY - TouTenN" <gelapplication[nospam]@libertysurf.fr> wrote in message
news:3f903650$0$27593$
> > Nope. Mais tu peux utiliser la clé pour y placer la valeur que tu
désires,
> > tant que c'est de type String
> >
> > Maintenant, 50000 enregistrements d'une vingtaine de champs chacun
prenant
> > au maximum 10 octets par champs (String * 5 = 10 octets) tu obtiens un
> total
> > d'approximativement 10 Mo ce qui est raisonnable de nos jours. Tu
pourrais
> > donc simplement te faire un Type ou une Classe et stocker tes objets
dans
> > une collection.
>
> Je viens de faire un essai, ça passe mais le gros problème c'est


l'index,
il
> me refuse des valeurs aléatoires (discontinues)
>
> Puis-je realiser une recherche rapide sur une des valeurs stockées????
>
> --
> Guy-TouTenN
>
> |¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|
> http://le.train.digital.free.fr
>
> |_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|¯|_|
>
>




Avatar
Zoury
Ne peux-tu pas mettre se champs comme clé lors de l'ajout de l'objet dans la
collection? Si tu ne me suis pas, dit le et je te fais un exemple.

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
Avatar
GuY - TouTenN
> Ne peux-tu pas mettre se champs comme clé lors de l'ajout de l'objet dans


la
collection?


Pourquoi pas, du moment que ça ralentit pas le fonctionnement

Si tu ne me suis pas, dit le et je te fais un exemple.




Je te suis à peut prêt, mais ton exemple serait le méga bienvenue

merci

--
Guy-TouTenN
Avatar
Zoury
Here it comes!

L'exemple suivant te montre le concept et en plus te montre comment
implémenté une classe collection. Supposons une collection de Personne (ok
c'est pas 20 champs là mais le concept est le même ;O))
(désolé pour les longues lignes)
'***
' Tu as besoin de...
' 1 Module
' 2 Class Module nommé, CPersonne et CPersonnes
' Module1
Option Explicit

Private Sub Main()

Dim pers As CPersonnes
Dim per As CPersonne

Set pers = New CPersonnes

' On popule la collection, il est possible
' de modifier cette dernière afin d'ajouter
' un objet CPersonne directement au lieu
' de passé les paramètres un à un
Call pers.Add("Lefebvre", "Yanick", DateSerial(1980, 9, 6), "Lefebvre")
Call pers.Add("Larose", "Bob", DateSerial(1971, 11, 19), "Larose")
Call pers.Add("Pouliotte", "Gilles", DateSerial(1954, 3, 2),
"Pouliotte")

' Appelle par clé
Debug.Print "Recherche par clé : "
Debug.Print , pers("Lefebvre").Nom, pers("Lefebvre").Prenom,
Format$(pers("Lefebvre").DateNaissance, "long date")

' Appelle par index
Debug.Print "Recherche par index :"
Debug.Print , pers(2).Nom, pers(2).Prenom,
Format$(pers(2).DateNaissance, "long date")

' Suppression d'un enregistrement
Call pers.Delete("Pouliotte")

' Boucle avec for each :O)
Debug.Print "For Each : "
For Each per In pers
Debug.Print , per.Nom, per.Prenom, Format$(per.DateNaissance, "long
date")
Next per

End Sub

' CPersonne
Option Explicit

Private m_sNom As String
Private m_sPrenom As String
Private m_dtNaissance As Date
Private m_sKey As String
Private m_lIndex As Long

Public Property Get Nom() As String
Nom = m_sNom
End Property

Public Property Let Nom(ByRef sNom As String)
m_sNom = sNom
End Property

Public Property Get Prenom() As String
Prenom = m_sPrenom
End Property

Public Property Let Prenom(ByRef sPrenom As String)
m_sPrenom = sPrenom
End Property

Public Property Get DateNaissance() As Date
DateNaissance = m_dtNaissance
End Property

Public Property Let DateNaissance(ByRef dtNaissance As Date)
m_dtNaissance = dtNaissance
End Property

Public Property Get Key() As String
Key = m_sKey
End Property

Friend Property Let Key(ByRef sKey As String)
m_sKey = sKey
End Property

Public Property Get Index() As Long
Index = m_lIndex
End Property

Friend Property Let Index(ByRef lIndex As Long)
m_lIndex = lIndex
End Property

'CPersonnes
Option Explicit

Private m_col As Collection

Public Function Add _
( _
ByRef sNom As String, _
ByRef sPrenom As String, _
ByRef dtNaissance As Date, _
Optional ByRef sKey As String, _
Optional ByRef lIndex As Long = -1 _
) As CPersonne

Dim per As CPersonne
Set per = New CPersonne

per.Nom = sNom
per.Prenom = sPrenom
per.DateNaissance = dtNaissance
per.Key = sKey

If LenB(sKey) <> 0 And lIndex > 0 Then
Call m_col.Add(per, sKey, lIndex)
per.Index = lIndex
ElseIf LenB(sKey) <> 0 And lIndex <= 0 Then
Call m_col.Add(per, sKey)
per.Index = m_col.Count
ElseIf LenB(sKey) = 0 And lIndex > 0 Then
Call m_col.Add(per, , lIndex)
per.Index = lIndex
Else
Call m_col.Add(per)
per.Index = m_col.Count
End If

End Function

' Pour permettre l'utilisation de la boucle For Each
' il faut :
' - implémenter cette méthode
' - aller dans le gestionnaire de procédures
' (dans le menu outils)
' - sélectionner NewEnum dans la liste
' - cliquer sur Avancé
' - Mettre -4 comme procédure ID
' - Cocher "Caché ce membre"
Public Function NewEnum() As IEnumVARIANT
Set NewEnum = m_col.[_NewEnum]
End Function

' Pour permettre l'utilisation par défaut
' de cette propriété, c'est à dire
' pers(1).Nom au lieu de pers.Items(1).Nom
' il faut :
' - implémenter cette méthode
' - aller dans le gestionnaire de procédures
' (dans le menu outils)
' - sélectionner Items dans la liste
' - cliquer sur Avancé
' - Mettre "(Défaut)" comme procédure ID
Public Function Items(ByRef v As Variant) As CPersonne
Set Items = m_col.Item(v)
End Function

Public Function Count() As Long
Count = m_col.Count
End Function

Public Sub Delete(ByVal v As Variant)
Call m_col.Remove(v)
End Sub

Private Sub Class_Initialize()
Set m_col = New Collection
End Sub

Private Sub Class_Terminate()
Set m_col = Nothing
End Sub
'***

--
Cordialement
Yanick Lefebvre - MVP pour Visual Basic
http://faq.vb.free.fr/?rubrique=0 - http://www.mvps.org/vbnet/
http://www.mentalis.org/agnet/apiguide.shtml - http://www.mztools.com/

Merci de poster les réponses au groupe afin d'en faire profiter à tous
1 2