GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Prüfmuster, die in Sqlite nicht existieren?

Ich habe eine ähnliche Situation mit einfachen Textdateien auf Grep erklärt, eine riesige Anzahl von Mustern aus einer riesigen Datei. Viele Leute dort sagten, ich sollte es tun, also migriere ich jetzt meine Daten in eine SQLite-Datenbank:

Ich habe eine Datei, aus der ich ungefähr 10.000 Muster extrahiere. Dann überprüfe ich, ob die Datenbank solche Muster nicht enthält. Wenn nicht, muss ich sie extern in file speichern zur Weiterverarbeitung:

for id in $(grep ^[0-9] keys); do
  if [[ -z $(sqlite3 db.sqlite "select id from main where id = $id") ]]; then
    echo $id >>file
  fi
done

Da ich neu in SQL bin, konnte ich keinen einfachen Weg finden, dies zu tun. Außerdem ist diese Schleife nutzlos, da sie 20-mal langsamer ist als das, was ich mit awk erreicht habe auf der genannten URL.

Da die Datenbank riesig ist, ständig wächst und ich diese Schleife sehr häufig ausführe, ist es möglich, sie schneller zu machen?

Akzeptierte Antwort:

Für jedes Muster rufen Sie eine neue Instanz von sqlite auf Programm, das sich neu mit der Datenbank verbindet. Das ist eine Verschwendung. Sie sollten eine einzelne Abfrage erstellen, die nach einem der Schlüssel sucht, und dann diese eine Abfrage ausführen. Datenbankclients sind gut darin, große Abfragen auszuführen.

Wenn die passenden Zeilen in den keys Datei nur Ziffern enthält, dann können Sie die Abfrage wie folgt aufbauen:

{
  echo 'select id from main where id in (';
  <keys grep -x '[0-9][0-9]*' |     # retain only lines containing only digits
  sed -e '1! s/^/, /' |             # add ", " at the beginning of every line except the first
  echo ');'
} | sqlite3 db.sqlite

Für allgemeinere Eingabedaten haben Sie folgende Idee:Verwenden Sie Texttransformationen, um eine einzige große Abfrage zu erstellen. Achten Sie darauf, Ihre Eingabe zu validieren; Hier stellen wir sicher, dass das, was in die Abfrage eingefügt wird, syntaktisch gültig ist. Im obigen Beispiel gibt es tatsächlich einen Sonderfall:Wenn es keine Übereinstimmung in der Datei gibt, ist die SQL-Syntax ungültig; In diesem Fall müssen Sie diesen Fall speziell behandeln. Hier ist komplexerer Code, der sich um den leeren Fall kümmert:

<keys grep -x '[0-9][0-9]*' |
if read first; then {
    echo 'select id from main where id in (' "$first"
    sed -e 's/^/, /'
    echo ');'
  } | sqlite3 db.sqlite
fi

Linux
  1. So überprüfen Sie die Syntax von Sudoers

  2. Bash-Skript:Prüfen, ob eine Datei eine Textdatei ist?

  3. Existiert ein Liner zum Überprüfen der Datei?

  4. Suchen Sie die Datei und wechseln Sie dann in dieses Verzeichnis in Linux

  5. Wie überprüfe ich Syslog in Bash unter Linux?

Ansible:Prüfen, ob eine Datei existiert

So überprüfen Sie, ob eine Datei oder ein Verzeichnis in Bash vorhanden ist

So überprüfen Sie, ob eine Datei oder ein Verzeichnis in Bash vorhanden ist

So überprüfen/reparieren Sie das Linux-Dateisystem beim Booten

grep Paare von Mustern und Datei

Prüfen, ob ein Dateideskriptor auf eine gelöschte Datei verweist (in Bash)