سؤال

قمت بتنزيل قاعدة بيانات تم تصديرها إلى تنسيق TXT ولديها حوالي 700 ميغابايت مع 7 ملايين سجل (1 لكل سطر). قمت بإجراء برنامج نصي لاستيراد البيانات إلى قاعدة بيانات MySQL، ولكن عندما يتم إدراج حوالي 4 ملايين سجل في تعطل المستعرض. لقد اختبرت في فايرفوكس وإلا. هل يمكن لشخص ما أن يعطيني رأي وبعض النصائح حول هذا الموضوع؟

البرنامج النصي هذا:

<?php
set_time_limit(0);
ini_set('memory_limit','128M');

$conexao = mysql_connect("localhost","root","") or die (mysql_error());
$base = mysql_select_db("lista102",$conexao) or die (mysql_error());
$ponteiro = fopen("TELEFONES_1.txt","r");
$conta = 0;
function myflush(){ ob_flush(); flush(); }

while(!feof($ponteiro)){
    $conta++;

    $linha = fgets($ponteiro,4096);
    $linha = str_replace("\"", "", $linha);
    $arr = explode(";",$linha);
    $sql = "insert into usuarios (CPF_CNPJ,NOME,LOG,END,NUM,COMPL,BAIR,MUN,CEP,DDD,TELEF) values ('".$arr[0]."','".$arr[1]."','".$arr[2]."','".$arr[3]."','".$arr[4]."','".$arr[5]."','".$arr[6]."','".$arr[7]."','".$arr[8]."','".$arr[9]."','".trim($arr[10])."')";
    $rs = mysql_query($sql);
    if(!$rs){ echo $conta ." error";}

    if(($conta%5000)==4999) { sleep(10); echo "<br>Pause: ".$conta; }
    myflush();
}

echo "<BR>Eof, import complete";
fclose($ponteiro);
mysql_close($conexao);
?>
هل كانت مفيدة؟

المحلول

حاول تقسيم الملف في 100 ميغابايت من قطع. هذا هو اقتراح حل سريع لإنجاز المهمة. يمكن أن تصبح مشكلة المتصفح معقدة لحلها. حاول أيضا المتصفحات المختلفة.

لدى PhpMyAdmin خيارات لمواصلة الاستعلام إذا حدث تعطل. يسمح المقاطعة للاستيراد في حالة البرنامج النصي بالكشف عن أنه قريب من الحد الزمني. قد يكون هذا وسيلة جيدة لاستيراد الملفات الكبيرة، ومع ذلك يمكن أن يكسر المعاملات.

نصائح أخرى

لست متأكدا من السبب في أنك تحتاج إلى متصفح ويب لإدراج السجلات في MySQL. لماذا لا تستخدم مرافق الاستيراد في قاعدة البيانات نفسها وتترك الويب من ذلك؟

إذا لم يكن ذلك ممكنا، فأنا أتساءل عما إذا كانت الشفنة في مجموعات من 1000 في كل مرة ستساعد. بدلا من ارتكاب قاعدة البيانات بأكملها كمعاملة واحدة، أود أن أوصي بانكارها.

هل تستخدم InnoDB؟

  1. ما لاحظته لأول مرة هو أنك تستخدم فلوش () بصورة غير مسبوقة. القيام بالتدفق () عندما يكون المخزن المؤقت httpd نتيجة كاملة في خطأ وتموت البرنامج النصي الخاص بك. التخلي عن كل هذا myflush () الحل البديل واستخدام واحد ob_implicit_flush.() في حين أن.

  2. لا تحتاج إلى رؤيته مع متصفحك لجعله يعمل حتى النهاية، يمكنك وضع ignore_user_abort.() لذلك يجب أن يكمل التعليمات البرمجية وظيفتها حتى إذا مات متصفحك.

  3. لست متأكدا لماذا يموت المتصفح الخاص بك. ربما يولد البرنامج النصي الخاص بك الكثير من المحتوى.

جربه بدون

u003Cbr>وقفة: nnnn.

الإخراج إلى المتصفح، ومعرفة ما إذا كان ذلك يساعد. قد يكون الأمر ببساطة أن المتصفح يختنق على صفحة الويب الطويلة التي يطلب منها تقديمها.

أيضا، هل توقيت PHP أثناء النقل الطويل؟

لا يساعد ذلك أيضا، أن لديك نوم (10) مضيفا إلى الوقت الذي يستغرقه الأمر.

يمكنك محاولة تقسيم الملف في ملفات TXT المختلفة، وإعادة العملية باستخدام الملفات. أعلم أنني استخدمت على الأقل هذا النهج مرة واحدة.

يتختطف المتصفح لأن الطلب يستغرق وقتا طويلا لإكماله. هل هناك سبب يجب أن تكون هذه العملية جزءا من صفحة ويب؟ إذا اضطررت بالتأكيد إلى القيام بذلك بهذه الطريقة، ففكر في تقسيم بياناتك في قطع قابلة للإدارة.

قم بتشغيل التعليمات البرمجية الخاصة بك في سطر الأوامر باستخدام PHP-CLI. بهذه الطريقة، لن تواجه مطلقا مرة أخرى لعملية تشغيل طويلة. على الرغم من أن الوضع هو تحطم المتصفح الخاص بك قبل المهلة ^^. إذا حاولت تنفيذها في خادم الاستضافة، فلن يكون لديك Access Shell، فقم بتشغيل التعليمات البرمجية باستخدام Crontab. ولكن عليك أن تتأكد من أن Crontab تشغيل فقط مرة واحدة!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top