MySQL में विशाल txt आयात करने का टाइमआउट

I'm trying to import a huge txt in mysql.
it is my first attempt to use PHP and MySQL so I'm not sure where is the problem.
I have a txt of almost the 4 million row and I need to store it in a db.
I wrote this pice of PHP to do the job:

$con=mysqli_connect('localhost', 'root', 'root', 'commuting');
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }


$handle = fopen("matrix_pendo2001.txt", "r") or die("Couldn't get handle");
if ($handle) {
    while (!feof($handle)) {

        $line = fgets($handle, 4096);

        $a = substr($line,0,3);
        $b = substr($line,4,3);
        $c = substr($line,8,1);
        $d = substr($line,10,1);
        $e = substr($line,12,1);
        $f = substr($line,14,3);
        $g = substr($line,18,3);
        $h = substr($line,22,3);
        $i = substr($line,26,1);
        $l = substr($line,28,2);
        $m = substr($line,31,1);
        $n = substr($line,33,1);
        $o = substr($line,35,8);

        $sql="INSERT INTO ita (ProvRes, ComRes, Sesso, Motivo, Luogo, ProvLav, ComLav, StatExt, MercPrev, Mezzo, Ora, Tempo, Num)
        VALUES 
        ('$a', '$b', '$c', '$d', '$e', '$f', '$g', '$h', '$i', '$l', '$m', '$n', '$o')";

        if (!mysqli_query($con,$sql))
          {
          die('Error: ' . mysqli_error($con));
          }
        echo "record '" . $line . "' added. 
"; } fclose($handle); } mysqli_close($con);

लिपि अच्छी तरह से काम करती प्रतीत होती है, लेकिन मुझे डीबी में पूरी पंक्ति नहीं मिल सकती है।
1 मिलियन से भी कम के बाद स्क्रिप्ट स्पष्ट त्रुटि के बिना समाप्त होता है।
मैंने max_execution_time को 0 पर सेट किया है और memory_limit को 2048MB तक बढ़ाया है लेकिन कुछ भी नहीं बदला है।

0
मैं टर्मिनल में कोड नहीं चला रहा हूं, मैं बस ब्राउजर में PHP पेज लोड करता हूं। अब मैं लोड डेटा इन्फाइल का उपयोग करने की कोशिश कर रहा हूं (mcuadors उत्तर को देखें) लेकिन सही काम नहीं कर रहा है।
जोड़ा लेखक danipen, स्रोत
set_time_limit (0);
जोड़ा लेखक Jompper, स्रोत
क्या आप इसे कमांड लाइन के माध्यम से चलाते हैं?
जोड़ा लेखक galchen, स्रोत

1 उत्तर

मेरा सुझाव है कि आप लोड डेटा इन्फाइल का उपयोग करें, यह एसक्यूएल कमांड सीधे सर्वर में निष्पादित किया जा सकता है और टाइमआउट से बच जाएगा और स्थानीयहोस्ट में चलने का सबसे तेज़ तरीका होगा।

यह एक छोटा सा उदाहरण है:

LOAD DATA INFILE '/tmp/test.txt' INTO TABLE test
  FIELDS TERMINATED BY ','  LINES STARTING BY 'xxx';

इस प्रश्न के आधार पर: लोडिंग-निश्चित-चौड़ाई-स्थान-सीमांकित -txt-file-in-mysql आप इस संभावित समाधान को आजमा सकते हैं:

LOAD DATA LOCAL INFILE 
'/yourfile.txt' 
INTO TABLE clip
(@row)
SET a = TRIM(SUBSTR(@row,0,3)),
    b = TRIM(SUBSTR(@row,4,3)),
    c = TRIM(SUBSTR(@row,10,1)),
    ......
;
0
जोड़ा
समस्या यह है कि फ़ाइल कोई delimiter के साथ एक txt है, लेकिन ठीक कॉलम के साथ: पहले 0 char शुरू करें; 4 पर दूसरा, 8 पर तीसरा आदि (सबस्ट्रिंग varible देखें)। एक पूर्व पंक्ति इस तरह दिखती है: "001 001 1 1 1 001 001 1 06 1 1 2"
जोड़ा लेखक danipen, स्रोत
मैं अपने txt को एक कामकाजी सीएसवी में कैसे परिवर्तित कर सकता हूं? और लोड डेटा का उपयोग कैसे करें?
जोड़ा लेखक danipen, स्रोत
वाह धन्यवाद! मैं अभी कोशिश करने जा रहा हूँ।
जोड़ा लेखक danipen, स्रोत
नहीं ... कुछ गड़बड़ है ... क्वेरी बहुत तेज़ है लेकिन यह 11 9 2 रिकॉर्ड उत्पन्न करती है और संग्रहित डेटा txt में नहीं है ... ऐसा लगता है कि कुछ एन्कोडिंग समस्या है। यहां एक स्क्रीनशूट dropbox.com/s/bhn3fzoqmw0r52a/& hellip;
जोड़ा लेखक danipen, स्रोत
मैं फ़ाइल को हटाता हूं और इसकी एक नई प्रति बना देता हूं और अब क्वेरी काम करता है !!! 3870728 पंक्ति आयात करने के लिए केवल 68.5 9 25 सेकंड। क्वेरी में एकमात्र त्रुटि SUBSTR है क्योंकि गिनती 1 से शुरू होती है और 0 पर नहीं होती है।
जोड़ा लेखक danipen, स्रोत
मैं देखता हूं, फिर पहले सीएसवी को ठीक करता हूं और लोड डेटा का उपयोग करने के बाद, कई गुना अधिक तेज़ होगा। मैं वादा करता हूं कि बेहतर तरीका है।
जोड़ा लेखक mcuadros, स्रोत