نمایش نتایج: از شماره 1 تا 9 , از مجموع 9

موضوع: چگونه یک کد php را روی یک فایل سنگین اجرا کنیم؟

Threaded View

پست قبلی پست قبلی   پست بعدی پست بعدی
  1. #5
    عضو انجمن سیدرضا بازیار آواتار ها
    تاریخ عضویت
    Mar 2013
    محل سکونت
    کازرون
    نوشته ها
    714
    تشکر تشکر کرده 
    3,740
    تشکر تشکر شده 
    1,021
    تشکر شده در
    701 پست

    پیش فرض پاسخ : چگونه یک کد php را روی یک فایل سنگین اجرا کنیم؟

    نقل قول نوشته اصلی توسط T.Toosi نمایش پست ها
    باسلام، اگر از file استفاده کنید با توجه به حجم فایل نیاز به مموری دارید، به طور مثال اگر فایل 500mb هست نیاز هست داخل PHP.INI محدودیت مموری را تنظیم کنید، اما اگر از fopen استفاده کنید چون اشاره گر هست اگر سیستم عامل 32 بیت است می توانید تا 2 گیگ فایل (به صورت stream) بارگذاری کنید، اگر بیشتر از 2 گیگ است باید سیستم عامل 64 بیت و PHP 7 استفاده کنید.

    کد:
    $lines = file($fname);
    سیستم عامل من ۶۴ بیتی هست و php7 استفاده میکنم
    الان توی php.ini باید چی بنویسم؟

    - - - Updated - - -

    نقل قول نوشته اصلی توسط JeyServer نمایش پست ها
    سلام
    من با برنامه زیر یک فایل دیگه حاوی 21 میلیون آدرس دامنه (که تعداد دامنه com شانسی است)‌ ایجاد کردم.
    کد PHP:
    <?php
    $chars 
    implode(""array_merge(range('a''z'), range('A''Z'), range('0''9')));
    $tlds = array('com''net''org''ir');
    $file fopen('domains.txt''a');
    for(
    $x 0$x 21000000;$x++) {
        
    $length rand(5,15);
        
    $tld $tlds[rand(0count($tlds) - 1)];
        
    $chars str_shuffle($chars);
        
    fwrite($filesubstr($chars0$length).'.'.$tld."\n");
    }
    fclose($file);
    حجم فایل نهایتا 309.7 مگابایت شد.
    با برنامه زیر آدرس های غیر com رو جدا کردم:
    کد PHP:
    <?php
    $source 
    fopen('domains.txt''r');
    $dest fopen("domains-filtered.txt"'w');
    while ((
    $line fgets($source128)) !== false) {
        if (
    substr(rtrim($line), -4) != ".com") {
            
    fwrite($dest$line);
        }
    }
    fclose($source);
    fclose($dest);
    این برنامه توی 44.97 ثانیه روی سیستم من اجرا شد و حجم فایل خروجی 231 مگابایت شد:
    کد:
    ➜  Desktop /usr/bin/time -v php b.php
        Command being timed: "php b.php"
        User time (seconds): 12.17
        System time (seconds): 32.01
        Percent of CPU this job got: 98%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:44.97
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 29392
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 2015
        Voluntary context switches: 4
        Involuntary context switches: 1069
        Swaps: 0
        File system inputs: 8
        File system outputs: 451232
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0

    ----------------------
    هرچند که این سوال استاتر نبود اما برای خودم جالب بود که این بار همون فایل رو با یک زبان سطح پایینتر مقایسه کنم بنابراین من یکبار دیگه همون فایل قبلی رو با برنامه ی c پردازش کردم:


    کد:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void){
        char * line = NULL;
        size_t len = 0;
        ssize_t read;
        char tld[5];
        
        FILE * source = fopen("./domains.txt", "r");
        if (source == NULL)
            exit(EXIT_FAILURE);
    
        FILE * dest = fopen("./domains-filtered.txt", "w");
        if (dest == NULL)
            exit(EXIT_FAILURE);
    
        while ((read = getline(&line, &len, source)) != -1) {
            memcpy( tld, &line[read - 5], 4);
            tld[4] = '\0';
            if (strcmp(tld, ".com")) {
                fwrite(line, 1, read, dest);
            }
        }
    
        fclose(source);
        fclose(dest);
        if (line)
            free(line);
        exit(EXIT_SUCCESS);
    }
    این بار برنامه توی 2.61 ثانیه اجرا شد (حدودا 17 برابر سریعتر)
    کد:
    ➜  Desktop /usr/bin/time -v ./a.out
        Command being timed: "./a.out"
        User time (seconds): 1.34
        System time (seconds): 0.23
        Percent of CPU this job got: 60%
        Elapsed (wall clock) time (h:mm:ss or m:ss): 0:02.61
        Average shared text size (kbytes): 0
        Average unshared data size (kbytes): 0
        Average stack size (kbytes): 0
        Average total size (kbytes): 0
        Maximum resident set size (kbytes): 1244
        Average resident set size (kbytes): 0
        Major (requiring I/O) page faults: 0
        Minor (reclaiming a frame) page faults: 64
        Voluntary context switches: 6
        Involuntary context switches: 114
        Swaps: 0
        File system inputs: 0
        File system outputs: 451224
        Socket messages sent: 0
        Socket messages received: 0
        Signals delivered: 0
        Page size (bytes): 4096
        Exit status: 0
    کد شما به خوبی کار میکنه... چرا کد من کار نمیکرد؟
    ویرایش توسط سیدرضا بازیار : April 22nd, 2018 در ساعت 14:25
    دوستدار کتاب بلیان

اطلاعات موضوع

کاربرانی که در حال مشاهده این موضوع هستند

در حال حاضر 1 کاربر در حال مشاهده این موضوع است. (0 کاربران و 1 مهمان ها)

موضوعات مشابه

  1. استفاده از آنتی ویروس قوی روی وی پی اس ویندوزی
    توسط samiraabd در انجمن سوالات و مشکلات
    پاسخ ها: 3
    آخرين نوشته: May 6th, 2016, 17:05
  2. پاسخ ها: 3
    آخرين نوشته: July 30th, 2015, 16:08
  3. پاسخ ها: 6
    آخرين نوشته: March 15th, 2014, 13:33
  4. پاسخ ها: 5
    آخرين نوشته: August 25th, 2012, 00:49
  5. ساخت وی پی اس ویندوز در وی ام ویر VMWare ESXi – بخش سوم
    توسط supportvps در انجمن مباحث و منابع آموزشی
    پاسخ ها: 1
    آخرين نوشته: August 19th, 2012, 17:01

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •