Bonjour

Je travaille actuellement a l'optimisation d'une application que j'ai déjà créée en VB.net, elle utilise un grand nombre de données d'un logiciel de calcul (FEMAP) pour faire les traiter.
Pour l'instant j'utilise de simple liste pour stocker mes données. Mais je suis obliger de les parcourir souvent pour trouver certaines infos.
J'ai une liste d'élément avec pour chaque élément 3 ou 4 nœuds associés (et d'autres informations), et une liste de nœuds avec pour chaque des coordonnées (et d'autres informations), quand je traite un élément j'ai besoin de récupérer les coordonnées des nœuds qui le définissent.
Je précise qu'il peut y avoir plusieurs centaines de milliers d'éléments et de nœuds, mais que une fois les données récupérées le traitement de chaque élément est indépendant, j'ai donc déjà mis en place du miltithreading pour utilise toute la puissance du processeur
J'essaie de stocker c'est données dans une DataTable ou une base SQL locale pour faciliter leur utilisation.
Pour l'instant j'ai créé une boucle pour tout stocker dans une base locale, mais je me dit qu'il doit bien y avoir une solution pour stocker massivement des données.

Ma boucle de stockage actuelle :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Dim cmd As New System.Data.SqlClient.SqlCommand
Dim ma_string As String
cmd.CommandType = System.Data.CommandType.Text
cmd.CommandText = "DELETE FROM Element;"
cmd.Connection = bdd_locale
cmd.ExecuteNonQuery()
For arg = 0 To numElem - 1
	ma_string = "INSERT Element (Elt_id, Prop, Type, Topo, Layer, Color, Orient, ND1, ND2, ND3, ND4) " &
		"VALUES (" & elt_ID(arg) & ", " & elt_propID(arg) & ", " & elt_Type(arg) & ", " & elt_topology(arg) & ", " &
		elt_Layer(arg) & ", " & elt_color(arg) & ", '" &
		CStr(elt_orient(3 * arg)).Replace(",", ".") & "', " &
		elt_nodes(20 * arg) & ", " & elt_nodes(20 * arg + 1) & ", " &
		elt_nodes(20 * arg + 2) & ", " & elt_nodes(20 * arg + 3) & " )"
	cmd.CommandText = ma_string
	cmd.Connection = bdd_locale
	cmd.ExecuteNonQuery()
Next
Code que j'ai commencé d'écrire pour récupère les coordonnées d'un nœuds :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub coord_noeud_MT(id_noeud As Integer, ByRef coord() As Double, ByRef base As Object)
	Dim requete As String
	Dim myreader As System.Data.SqlClient.SqlDataReader
	requete = "SELECT X, Y, Z FROM Node WHERE ND_ID = " & id_noeud & ";"
	Dim cmd As Object 'New SqlCommand(requete, bdd_locale)
	cmd = New System.Data.SqlClient.SqlCommand(requete, base)
	myreader = cmd.ExecuteReader
	myreader.Read()
	coord(0) = myreader.GetDouble(0) 'CDbl(myreader("X"))
	coord(1) = myreader.GetDouble(1) 'CDbl(myreader("Y"))
	coord(2) = myreader.GetDouble(2) 'CDbl(myreader("Z"))
	myreader.Close()
End Sub
L'initialisation de la connexion à la base locale :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
    Public Sub init_connexion_locale()
        On Error GoTo pb_MDF
        bdd_locale.ConnectionString = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=" & Application.StartupPath & "\SoFa_Elt_Nd.mdf;Integrated Security=True"
        bdd_locale.Open()
        On Error GoTo 0
        MDF_OK = True
        AppFemap.feAppMessage(FCM_HIGHLIGHT, "connecté à la base locale OK    " & Now)
        Exit Sub
pb_MDF: MsgBox("Impossible de se connecter au fichier MDF.")
        MDF_OK = False
        AppFemap.feAppMessage(FCM_HIGHLIGHT, "connection impossible à la base locale OK    " & Now)
    End Sub
Cela fonctionne semble poser problème en multitreading si j'utilise toujours la même connexion à la base locale.

Peut-être faudrait seulement stocker dans une DataTable, mais pour l'instant je ne sais pas non plus comment la remplir sans passer par une boucle sur les lignes.

Merci d'avance pour vos suggestions et remarques.