Domanda

Domanda finale per la notte. E ci scusiamo per la completa noobness di questo.

Ho ottenuto, con l'aiuto di StackOverflow e Google, il seguente ...

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 ADOCommand1->CommandText = "drop table pictures purge";
 ADOCommand1->Execute();
 ADOCommand1->CommandText = "create table pictures(id autoincrement, filename TEXT(255), notes text(255), category text(20), rank int, filedate datetime,constraint table1_PK primary key(id));";
 ADOCommand1->Execute();
 AddFiles(Edit1->Text);
}
//---------------------------------------------------------------------------

int AddFiles(AnsiString path, int count)
{
 TSearchRec sr;
 int f,count2=0;
 f = FindFirst(path+"\\*.*", faAnyFile, sr);
 while( !f )
 {
  if(sr.Attr & faDirectory)
  {
   if(sr.Name != "."   &&   sr.Name != "..")
   {
    AnsiString subpath;
    subpath.sprintf("%s%s%s", path, "\\", sr.Name);
    count = AddFiles(subpath,count);
   }
  }
  else
  {
   Form1->ADOCommand1->CommandText = "Insert into pictures (filename) values ('" + StringReplace(path + "\\" + sr.Name, "'", "''", TReplaceFlags()<<rfReplaceAll) + "')";
   Form1->ADOCommand1->Execute();
   ++count;
   ++count2;
   if (count2 > 100)
   {
    count2 = 0;
    Form1->Caption = "Added " + IntToStr(count)+ " Files.";
    Application->ProcessMessages();
   }

  }
  f = FindNext(sr);

 }
 FindClose(sr);
return count;
}

Sta fondamentalmente attraversando una determinata directory e i suoi sottodir, e aggiungendo ogni file (con percorso) a un database MS Access.

(Sono l'unico utente quindi non mi interessa molto della sicurezza)

Con un gran numero di file questo codice è orribilmente lento. Qualcuno può descrivere un modo migliore per fare ciò che il codice sta facendo (speriamo senza rendere la tua risposta troppo complicata. Sono un noob per questo ricordo)

È stato utile?

Soluzione

Il collo di bottiglia nel codice è probabilmente il livello del database ADO / Access. Le funzioni a livello di directory (FindFirst (), FindNext ()) sono relativamente veloci. È possibile verificare se il database è il collo di bottiglia sostituendo quelle chiamate con istruzioni cout. La mia ipotesi è che funzionerà molto più velocemente quando si trasmettono i risultati alla console.

Nella mia esperienza, Access non è un database ad alte prestazioni e i driver ADO non sono veloci come i driver nativi. Scommetto che se sostituissi il database con un database più serio, otterrai prestazioni migliorate.

Altri suggerimenti

Primo: non è necessario eliminare / creare la tabella. Crealo una volta e poi chiama " elimina dalle immagini " ;, quando desideri ripristinarlo. Secondo: commenta " Form1- > ADOCommand1- > Execute (); " e vedi quanto diventa più veloce. Ciò mostra se il problema riguarda il salvataggio nel database.

Se hai intenzione di sviluppare alcune cose serie in futuro, allora ti consiglio di cercare soluzioni migliori per il database. (Firebird incorporato, MySQL incorporato, ecc.).

Per MySQL ci sono Componenti CBuilder - molto buoni da usare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top