Son bir Wikipedia dökümü MySQL veritabanına aktarmaya çalışıyorum. Sorun şu ki, INSERT INTO text
MySQL komutlarını kullanarak 50 GiB text
tablosunu ekliyorum ve bunları bir metin dosyasına dönüştürmek istiyorum. mysql -u USERNAME -p DBNAME < text.sql
çok yavaş kullanarak AncakMySQL "INSERT" komutlarını metne dönüştür
INSERT INTO text (old_id,old_text,old_flags) VALUES (id1,'text1','flags1'),(id2,'text2','flags2'),...,(idN,'textN','flagsN');
:
Benim text.sql
dosyası aşağıdaki yapıya sahiptir. Zaten autocommit
, unique_checks
ve foreign_key_checks
'u devre dışı bırakıyorum ve tüm işlemleri bir START TRANSACTION; ... COMMIT;
bloğunun içine ekliyorum, ancak içe aktarma işlemi hala çok yavaş.
Araştırmadan sonra, LOAD DATA INFILE;
'un INSERT
komutlarını kullanmaktan çok daha hızlı olabileceğini here okudum. Bu nedenle, aşağıdaki gibi text.txt
için text.sql
dönüştürmek için arıyorum: Bunun için awk
kullanmayı düşünüyorum ama düzenli ifadeler ile benim deneyim çok sınırlı
id1,'text1','flags1'
id2,'text2','flags2'
...
idN,'textN','flagsN'
. Ayrıca, her bir INSERT
komutu, tek bir satırda, yukarıda gösterildiği gibi, değerleri ayıklamak için benim için daha da zorlaştırarak verilir.
text.sql
dosyasının 50 GiB olduğunu varsayalım, awk
'u kullanmanızı veya bir C/C++ programı geliştirmeyi önerir misiniz? awk
iyi bir yaklaşımsa, dönüşüme nasıl ulaşabilirim?
giriş 1. Örnek:
INSERT INTO text (old_id,old_text,old_flags) VALUES (id1,'text1','flags1'),(id2,'text2','flags2'),(id3,'text3','flags3');
Çıkış 1. Örnek:
id1,'text1','flags1'
id2,'text2','flags2'
id3,'text3','flags3'
giriş 2. Örnek:
INSERT INTO page (page_id,page_namespace,page_title,page_restrictions,page_is_redirect,page_is_new,page_random,page_touched,page_latest,page_len,page_content_model) VALUES (10,0,'AccessibleComputing','',1,0,RAND(),DATE_ADD('1970-01-01', INTERVAL UNIX_TIMESTAMP() SECOND)+0,631144794,69,'wikitext'),(12,0,'Anarchism','',0,0,RAND(),DATE_ADD('1970-01-01', INTERVAL UNIX_TIMESTAMP() SECOND)+0,703037144,180446,'wikitext');
çıkış # 2 (değerler parantez ile) örnek:
10,0,'AccessibleComputing','',1,0,RAND(),DATE_ADD('1970-01-01', INTERVAL UNIX_TIMESTAMP() SECOND)+0,631144794,69,'wikitext'
12,0,'Anarchism','',0,0,RAND(),DATE_ADD('1970-01-01', INTERVAL UNIX_TIMESTAMP() SECOND)+0,703037144,180446,'wikitext'
giriş 3. Örnek: (ile kaçan "ya da ")
INSERT INTO text (old_id,old_text,old_flags) VALUES (631144794,'#REDIRECT [[Computer accessibility]]\n\n{{Redr|move|from CamelCase|up}}','utf-8'),(703037144,'{{Redirect2|Anarchist|Anarchists
| Anarşistleri (belirsizliği giderme)}} \ N {{s-hareketlerinin | hayali karakter | Anarþist (çizgi) | diğer kullanımlar indef}} \ n {{İngiliz İngilizcesi | date = Ocak 2014}} ',' utf-8 ');
Çıktı 3. örnek:
631144794,'#REDIRECT [[Computer accessibility]]\n\n{{Redr|move|from CamelCase|up}}','utf-8'
703037144,'{{Redirect2|Anarchist|Anarchists|the fictional character|Anarchist (comics)|other uses|Anarchists (disambiguation)}}\n{{pp-move-indef}}\n{{Use British English|date=January 2014}}','utf-8'
düzenleme: Biraz daha araştırma sonrasında, normal ifadeler kullanarak örnekler 2. ve 3. dönüştürülemez olabileceği anlaşılıyor: kaynakları: #1, #2.
Dönüştürüldükten sonra dosyayı daha küçük parçalara bölerim, örn. 'split - lines n 'yi kullanarak bir 50G dosyası yerine – Cez