مشکل : لیمیت بودن file_get_contents و fread به 2 گیگابایت
سلام دوستان بنده نیاز دارم فایلی حجیم رو در php بخونم . متاسفانه fread و file_get_contents هر دو ارور 2 گیگ رو میدن
مثل ارور زیر
کد:
Warning: file_get_contents(): content truncated from 7351551328 to 2147483647 bytes in
چطوری میتونم این محدودیت رو بردارم ؟
سرور اختصاصی هست
پاسخ : مشکل : لیمیت بودن file_get_contents و fread به 2 گیگابایت
جسارتا چه داده ای هست ؟ نوع فایل رو بفرمایید تا راهکار اساسی اعلام گردد
پاسخ : مشکل : لیمیت بودن file_get_contents و fread به 2 گیگابایت
پاسخ : مشکل : لیمیت بودن file_get_contents و fread به 2 گیگابایت
نقل قول:
نوشته اصلی توسط
hoka
text هست قربان
خوب کارتوناشتباهه عزیز واسه داده های متنی حجیم سعی کنید به صورت تفکیک شده و حدالامکان از دیتابیس استفاده کنید.
توضیح بیشتری بدین تا روش های بهینه سازی و تقسیم اطلاعات رو بدیم خدمتتون.
پاسخ : مشکل : لیمیت بودن file_get_contents و fread به 2 گیگابایت
ما از دیتابیس فایل هارو آوردیم روی فایل به دلیل سرعت بیشتر . فعلا راه حل همین هست که فایل رو کامل بدون لیمیت بخونیم
پاسخ : مشکل : لیمیت بودن file_get_contents و fread به 2 گیگابایت
سلام
پیشنهاد میکنم از این روش خط به خط فایل رو پردازش کنید:
کد PHP:
<?php
$handle = fopen("inputfile.txt", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
// process the line read.
}
fclose($handle);
} else {
// error opening the file.
}
در این روش اطلاعات خط به خط خونده میشه و در متغیر line$ قرار میگیره اما خوبیش اینه که هیچ وقت نیاز به پر کردن حافظه RAM با کل 2 گیگ فایل نیست و اطلاعات فقط خط به خط buffer میشن.
البته حتی با این روش هم با اینکه احتمالاً مشکل RAM دیگه پیش نمیاد ولی به دلیل طولانی شدن پردازش 2 گیگ فایل اگر Request با مرورگر هستش به احتمال زیاد با خطای Time Out مواجه میشه مگر اینکه حجم فایل رو تیکه تیکه تر در هر Request جدا پردازش کنید.
منبع کد: http://stackoverflow.com/questions/1...by-line-in-php
پاسخ : مشکل : لیمیت بودن file_get_contents و fread به 2 گیگابایت
نقل قول:
نوشته اصلی توسط
AtrafNet
سلام
پیشنهاد میکنم از این روش خط به خط فایل رو پردازش کنید:
کد PHP:
<?php
$handle = fopen("inputfile.txt", "r");
if ($handle) {
while (($line = fgets($handle)) !== false) {
// process the line read.
}
fclose($handle);
} else {
// error opening the file.
}
در این روش اطلاعات خط به خط خونده میشه و در متغیر line$ قرار میگیره اما خوبیش اینه که هیچ وقت نیاز به پر کردن حافظه RAM با کل 2 گیگ فایل نیست و اطلاعات فقط خط به خط buffer میشن.
البته حتی با این روش هم با اینکه احتمالاً مشکل RAM دیگه پیش نمیاد ولی به دلیل طولانی شدن پردازش 2 گیگ فایل اگر Request با مرورگر هستش به احتمال زیاد با خطای Time Out مواجه میشه مگر اینکه حجم فایل رو تیکه تیکه تر در هر Request جدا پردازش کنید.
منبع کد:
http://stackoverflow.com/questions/1...by-line-in-php
ایشون به دلیل حجم بالا اصلا نمیتونن فایل رو بخونن بعدا شما از کجا درومدی میگی که پرداش ؟
اول باید داده خونده بشه تا بشه پردازشش کرد .
پاسخ : مشکل : لیمیت بودن file_get_contents و fread به 2 گیگابایت
نقل قول:
نوشته اصلی توسط
Azade.Kaveh
ایشون به دلیل حجم بالا اصلا نمیتونن فایل رو بخونن بعدا شما از کجا درومدی میگی که پرداش ؟
اول باید داده خونده بشه تا بشه پردازشش کرد .
کد اول به این دلیل با ارور مواجه میشه که کل فایل با اون دستور خونده میشه
کدی که دوست عزیز پیشنهاد دادن کل فایل رو نمی خونه و در رم ذخیره نمی کنه بلکه فایل رو باز می کنه و هر قسمتی رو که نیاز داشته باشید می خونه
در نتیجه اروری نمیگیرید
توضیحاتشون رو با دقت بیشتری بخونید
پاسخ : مشکل : لیمیت بودن file_get_contents و fread به 2 گیگابایت
نقل قول:
نوشته اصلی توسط
navid2zp
کد اول به این دلیل با ارور مواجه میشه که کل فایل با اون دستور خونده میشه
کدی که دوست عزیز پیشنهاد دادن کل فایل رو نمی خونه و در رم ذخیره نمی کنه بلکه فایل رو باز می کنه و هر قسمتی رو که نیاز داشته باشید می خونه
در نتیجه اروری نمیگیرید
توضیحاتشون رو با دقت بیشتری بخونید
کلا فانکشن fopen نمیتونه حجم بالا بخونه !
حالا ایشون اومدن اول خوندنش بعد اومدن لاین به لاین while کردن...
در ضمن اصلا فرض هم بگیریم که خونده شده باشه نه نشده ! یعنی بابت هر کوئری دیتابیس قراره 2 گیگ رم خورده بشه ؟ یعنی برای داشتن 100 کاربر آنلاین حداقل حداقل باید 200 گیگ رم در نظر گرفت !
کار باید از بیس درست باشه عزیز دل !
پاسخ : مشکل : لیمیت بودن file_get_contents و fread به 2 گیگابایت
نقل قول:
نوشته اصلی توسط
Azade.Kaveh
کلا فانکشن fopen نمیتونه حجم بالا بخونه !
حالا ایشون اومدن اول خوندنش بعد اومدن لاین به لاین while کردن...
در ضمن اصلا فرض هم بگیریم که خونده شده باشه نه نشده ! یعنی بابت هر کوئری دیتابیس قراره 2 گیگ رم خورده بشه ؟ یعنی برای داشتن 100 کاربر آنلاین حداقل حداقل باید 200 گیگ رم در نظر گرفت !
کار باید از بیس درست باشه عزیز دل !
درسته این روش اصلاً اصولی نیست ولی جناب من و شما نمی دونیم که استارتر برای چه کاری می خوان شاید اصلاً اونی که تو ذهن ماست یعنی یه وب سایت که قراره query رو از فایل حجیم بخونه نباشه شاید یه پروژه کار شخصی باشه.
چون خودم بار ها کار هایی داشتم که اصلاً عمومی نبودن و تونستم به هر روش ناشیانه ای هم شده حلش کنم میگم :->
درباره fopen هم استارتر گفتن fread که داده ها رو می خونه ایراد میگیره جسارتاً fopen به تنهایی وظیفه خوندن و بافر کردن داده ها رو نداره بلکه فقط یه file pointer ایجاد میکنه که باهاش کار کنیم :)
http://php.net/manual/en/function.fopen.php
لینکی هم که از stackoverflow.com در پست قبل دادم رو مطالعه کنید حجم فایل پرسش کننده در اون لینک هم 1 گیگ هستش.