Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

आर से एसक्यूएल में डेटा फ्रेम डालने का कुशल तरीका

टीएल; डॉ: LOAD DATA INFILE परिमाण का एक क्रम एकाधिक INSERT . से तेज है बयान, जो स्वयं एक INSERT . से तेज परिमाण का एक क्रम है बयान।

मैं आर से माइस्क्ल में डेटा आयात करने के लिए तीन मुख्य रणनीतियों के नीचे बेंचमार्क करता हूं:

  1. एकल insert बयान , जैसा कि प्रश्न में है:

    INSERT INTO test (col1,col2,col3) VALUES (1,2,3)

  2. एकाधिक insert बयान , इस प्रकार बनाया गया:

    INSERT INTO test (col1,col2,col3) VALUES (1,2,3),(4,5,6),(7,8,9)

  3. load data infile कथन , यानी mysql . में पहले से लिखी गई CSV फ़ाइल लोड करना :

    LOAD DATA INFILE 'the_dump.csv' INTO TABLE test

मैं RMySQL का उपयोग करता हूं यहां, लेकिन किसी भी अन्य MySQL ड्राइवर को समान परिणाम प्राप्त करने चाहिए। SQL तालिका के साथ त्वरित किया गया था:

CREATE TABLE `test` (
  `col1` double, `col2` double, `col3` double, `col4` double, `col5` double
) ENGINE=MyISAM;

कनेक्शन और परीक्षण डेटा R . में बनाए गए थे साथ:

library(RMySQL)
con = dbConnect(MySQL(),
                user = 'the_user',
                password = 'the_password',
                host = '127.0.0.1',
                dbname='test')

n_rows = 1000000 # number of tuples
n_cols = 5 # number of fields
dump = matrix(runif(n_rows*n_cols), ncol=n_cols, nrow=n_rows)
colnames(dump) = paste0('col',1:n_cols)

बेंचमार्किंग सिंगल insert कथन:

before = Sys.time()
for (i in 1:nrow(dump)) {
  query = paste0('INSERT INTO test (',paste0(colnames(dump),collapse = ','),') VALUES (',paste0(dump[i,],collapse = ','),');')
  dbExecute(con, query)
}
time_naive = Sys.time() - before 

=> इसमें लगभग 4 मिनट का समय लगता है मेरे कंप्यूटर पर

एकाधिक बेंचमार्किंग insert कथन:

before = Sys.time()
chunksize = 10000 # arbitrary chunk size
for (i in 1:ceiling(nrow(dump)/chunksize)) {
  query = paste0('INSERT INTO test (',paste0(colnames(dump),collapse = ','),') VALUES ')
  vals = NULL
  for (j in 1:chunksize) {
    k = (i-1)*chunksize+j
    if (k <= nrow(dump)) {
      vals[j] = paste0('(', paste0(dump[k,],collapse = ','), ')')
    }
  }
  query = paste0(query, paste0(vals,collapse=','))
  dbExecute(con, query)
}
time_chunked = Sys.time() - before 

=> इसमें लगभग 40 सेकंड का समय लगता है मेरे कंप्यूटर पर

बेंचमार्किंग load data infile कथन :

before = Sys.time()
write.table(dump, 'the_dump.csv',
          row.names = F, col.names=F, sep='\t')
query = "LOAD DATA INFILE 'the_dump.csv' INTO TABLE test"
dbSendStatement(con, query)
time_infile = Sys.time() - before 

=> इसमें लगभग 4 सेकंड लगते हैं मेरे कंप्यूटर पर

कई सम्मिलित मानों को संभालने के लिए अपनी SQL क्वेरी को क्राफ्ट करना प्रदर्शन को बेहतर बनाने का सबसे सरल तरीका है। LOAD DATA INFILE . में संक्रमण इष्टतम परिणामों की ओर ले जाएगा। अच्छे प्रदर्शन युक्तियाँ mysql प्रलेखन के इस पृष्ठ में पाई जा सकती हैं। /ए> ।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MYSQL में दो स्ट्रिंग्स के बीच समानता की गणना कैसे करें

  2. mysql उच्चारण वर्णों को बदलें

  3. MySQL में एक स्ट्रिंग में बिट्स की संख्या कैसे प्राप्त करें - BIT_LENGTH ()

  4. गिनती / डुप्लीकेट चुनें

  5. वर्चर (255) वी टिनीब्लोब वी टिनीटेक्स्ट