Ich habe die Tweet-Datenerfassung in SQLite mit Python gespeichert. Ein Memo, das ich auf verschiedene Weise recherchiert habe, weil ich es mit hoher Geschwindigkeit beim Multithreading mit Java machen wollte.
Beim Umgang mit SQLite Wenn Sie sqlite-jdbc verwenden, ist es einfach zu verwenden. Nehmen Sie es also von maven und verwenden Sie es.
Anfangs sammelte ich Daten auf der Festplatte,
Ich fragte mich, warum es so langsam war und es viel Zeit in Anspruch nahm, DBs hinzuzufügen, anstatt sie zu sammeln.
Ich habe nach der Ursache gesucht.
INSERT OR UPDATE
wurde durchgeführt, um Doppelarbeit (Tweets) zu vermeiden.Löse eins nach dem anderen
Beispiel für das Speichern des zuerst genannten Tweets
DataBase.java
/**
*Fahrerregistrierung
*/
public static void dbInit() {
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
/**
*Pragma-Einstellungen
*Hier 3.Jornal_Modus und Synchronisierung_Modus ist eingestellt
*/
public static Properties getProperties() {
Properties prop = new Properties();
prop.put("journal_mode", "MEMORY");
prop.put("sync_mode", "OFF");
return prop;
}
/**
*Verarbeitung zum Hinzufügen zur Datenbank
*Wenn Sie nicht synchronisieren, tritt beim Schreiben mit Multithread eine Dead Lock auf
*/
public static synchronized void putTweet2SQL(File dbFile, List<Status> tweet) {
Statement stmt;
String dbHeader = "jdbc:sqlite:" + dbFile.getAbsolutePath();
PreparedStatement pstmt;
dbInit();
try (Connection conn = DriverManager.getConnection(dbHeader, getProperties())) { //try-with-resources
conn.setAutoCommit(false);
stmt = conn.createStatement();
//Erstellen Sie, wenn Sie keine Datenbank haben
stmt.executeUpdate("CREATE TABLE IF NOT EXISTS tweets (tweet_id INTEGER PRIMARY KEY, user_id INTEGER, user_screen_name TEXT,tweet_text TEXT)");
//Tweet ID, Benutzer ID, Bildschirmname, Tweet Text
//2.Vorbereiten des Hinzufügens von Daten in großen Mengen
pstmt = conn.prepareStatement("INSERT OR IGNORE INTO tweets VALUES (?, ?, ?, ?)");
for (Status status : tweet) {
place = status.getPlace().getFullName();
pstmt.setLong(1, status.getId());
pstmt.setLong(2, status.getUser().getId());
pstmt.setString(3, status.getUser().getScreenName());
pstmt.setString(4, status.getText());
pstmt.addBatch();//1.Zur Verarbeitung hinzufügen
}
pstmt.executeBatch();//1.Der eigentliche Datenbankzusatzprozess wird hier durchgeführt
conn.commit();
} catch (SQLException e) {
e.printStackTrace();
}
}
Selbst beim Lesen aus der Datenbank ruft setFetchSize
die angegebene Nummer sofort auf, so dass es bis zu einem gewissen Grad bequem ist.
DataBase.java
/**
*Holen Sie sich Tweets
*Wenn Sie große Datenmengen abrufen, ist der Heap nicht ausreichend. Schreiben Sie in diesem Fall entsprechend neu
* @Tweet-Liste zurückgeben
*/
public static List<Status> getTweetsFromSQL(File dbFile) {
String dbHeader = "jdbc:sqlite:" + dbFile.getAbsolutePath();
PreparedStatement pstmt;
List<Status> userDetails = new ArrayList<>();//Geeignete Liste
dbInit();
try (Connection conn = DriverManager.getConnection(dbHeader, getProperties())) {
pstmt = conn.prepareStatement("SELECT * FROM tweets");
pstmt.setFetchSize(1000);//Wenn Sie 5000 Billionen oder so etwas einstellen, erhalten Sie alles auf einmal
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {//Tweet ID, Benutzer ID, Bildschirmname, Tweet Text
Status status = new status();
status.setId(rs.getLong(1));
status.setUserId(rs.getLong(2));
status.setScreenName(rs.getString(3));
status.setTweetText(rs.getString(4));
}
} catch (SQLException e) {
e.printStackTrace();
}
return userDetails;
}
Es ist viel schneller und ich bin glücklich, weil ich mehr SSDs kaufen könnte
Recommended Posts