Hướng dẫn import large csv file into mysql laravel - nhập tệp csv lớn vào mysql laravel

Tôi có một tệp CSV có thể dao động từ 50k đến hơn 100k hàng dữ liệu.

Tôi hiện đang sử dụng gói Laravel W/ Laravel Forge, MySQL và Maatwebsite Laravel Excel.

Điều này được sử dụng bởi người dùng cuối chứ không phải bản thân tôi nên tôi đã tạo ra một hình thức đơn giản trên chế độ xem lưỡi của mình như vậy:

{!! Form::open(
    array(
        'route' => 'import.store', 
        'class' => 'form',
        'id' => 'upload',
        'novalidate' => 'novalidate', 
        'files' => true)) !!}

    

CSV Product Import

{!! Form::file('upload_file', null, array('class' => 'file')) !!}
{!! Form::submit('Upload Products', array('class' => 'btn btn-success')) !!}
{!! Form::close() !!}

Điều này sau đó lưu trữ tệp trên máy chủ thành công và giờ đây tôi có thể lặp lại các kết quả bằng cách sử dụng một cái gì đó như vòng lặp foreach.

Bây giờ đây là những vấn đề tôi đang gặp

  1. [Vấn đề] Php Times Out.
  2. [Biện pháp khắc phục] đã thay đổi nó để chạy không đồng bộ thông qua một lệnh công việc.
  3. [Kết quả] nhập tới 1500 hàng.
  4. [Vấn đề] Máy chủ hết bộ nhớ.
  5. [Biện pháp khắc phục] Đã thêm ổ đĩa hoán đổi 1GB.
  6. [Kết quả] nhập tới 3000 hàng.
  7. [Vấn đề] Máy chủ hết bộ nhớ.
  8. [Biện pháp khắc phục] Đã thêm ổ đĩa hoán đổi 1GB.
  9. [Kết quả] nhập tới 3000 hàng.
  10. [Vấn đề] Máy chủ hết bộ nhớ.
  11. [Biện pháp khắc phục] Đã thêm ổ đĩa hoán đổi 1GB.
  12. [Kết quả] nhập tới 3000 hàng.

[Biện pháp khắc phục] Bật kết quả chunking của 250 hàng mỗi đoạn.

[Kết quả] Nhập tới 5000 hàng.

  • [Biện pháp khắc phục] Đã loại bỏ một số logic Tranpose/tham gia bảng.
  • [Kết quả] Nhập tới 7000 hàng.
  • Như bạn có thể thấy kết quả là cận biên và không nơi nào gần 50k, tôi thậm chí không thể làm cho nó gần 10k.
  • Tôi đã đọc và xem xét các đề xuất có thể như:

Sử dụng một truy vấn thô để chạy dữ liệu tải cục bộ.

Tách tệp trước khi nhập.

Lưu trữ trên máy chủ sau đó được chia thành máy chủ thành các tệp và có một xử lý chúng.

Nâng cấp giọt 512MB của tôi xuống 1GB như là phương sách cuối cùng.

Đi với dữ liệu tải cục bộ có thể không hoạt động vì các cột tiêu đề của tôi có thể thay đổi trên mỗi tệp đó là lý do tại sao tôi có logic để xử lý/lặp lại thông qua chúng.

Tách các tệp trước khi nhập là tốt dưới 10k nhưng với 50k trở lên? Điều đó sẽ rất không thực tế.

Lưu trữ trên máy chủ và sau đó có máy chủ tách nó ra và chạy chúng riêng lẻ mà không làm phiền người dùng cuối? Có thể nhưng thậm chí không chắc chắn làm thế nào để đạt được điều này trong PHP nhưng chỉ đọc ngắn gọn về điều đó.

Ngoài ra, cần lưu ý, nhân viên hàng đợi của tôi được đặt thành thời gian chờ trong 10000 giây, điều này cũng rất không thực tế và thực hành xấu nhưng dường như đó là cách duy nhất nó sẽ tiếp tục chạy trước khi bộ nhớ bị ảnh hưởng.

  1. Bây giờ tôi có thể đưa vào và chỉ nâng cấp bộ nhớ lên 1GB nhưng tôi cảm thấy tốt nhất nó có thể nhảy tôi lên 20k hàng trước khi nó thất bại trở lại. Một cái gì đó cần phải xử lý tất cả các hàng này một cách nhanh chóng và hiệu quả.
  2. Cuối cùng, đây là một cái nhìn thoáng qua về cấu trúc bàn của tôi:
  3. Inventory
    +----+------------+-------------+-------+---------+
    | id | profile_id | category_id |  sku  |  title  |
    +----+------------+-------------+-------+---------+
    |  1 |         50 |       51234 | mysku | mytitle |
    +----+------------+-------------+-------+---------+
    
    Profile
    +----+---------------+
    | id |     name      |
    +----+---------------+
    | 50 | myprofilename |
    +----+---------------+
    
    Category
    +----+------------+--------+
    | id | categoryId |  name  |
    +----+------------+--------+
    |  1 |      51234 | brakes |
    +----+------------+--------+
    
    Specifics
    +----+---------------------+------------+-------+
    | id | specificsCategoryId | categoryId | name  |
    +----+---------------------+------------+-------+
    |  1 |                  20 |      57357 | make  |
    |  2 |                  20 |      57357 | model |
    |  3 |                  20 |      57357 | year  |
    +----+---------------------+------------+-------+
    
    SpecificsValues
    +----+-------------+-------+--------+
    | id | inventoryId | name  | value  |
    +----+-------------+-------+--------+
    |  1 |           1 | make  | honda  |
    |  2 |           1 | model | accord |
    |  3 |           1 | year  | 1998   |
    +----+-------------+-------+--------+
    
    Full CSV Sample
    +----+------------+-------------+-------+---------+-------+--------+------+
    | id | profile_id | category_id |  sku  |  title  | make  | model  | year |
    +----+------------+-------------+-------+---------+-------+--------+------+
    |  1 |         50 |       51234 | mysku | mytitle | honda | accord | 1998 |
    +----+------------+-------------+-------+---------+-------+--------+------+
    
  4. Vì vậy, việc chạy nhanh qua quy trình làm việc logic của tôi càng đơn giản nhất có thể:
  5. Tải tệp vào Maatwebsite/Laravel-Excel và lặp qua một vòng lặp được chia
  6. Kiểm tra xem CADETORY_ID và SKU có trống khác bỏ qua và đăng nhập lỗi vào một mảng không.

Tra cứu CADETORY_ID và kéo tất cả các trường cột có liên quan từ tất cả các bảng liên quan mà nó sử dụng và sau đó nếu không có null chèn vào cơ sở dữ liệu.

Thanks!

Làm cách nào để nhập một tệp CSV lớn vào Workbench MySQL?

Nhập CSV vào MySQL bằng cách sử dụng Workbench..
Mở Trình hướng dẫn nhập trong MySQL Workbench. Để mở trình hướng dẫn nhập, hãy thu hút sự chú ý của bạn vào bảng điều hướng thường ở phía bên trái của MySQL Workbench. ....
Chọn nguồn dữ liệu. ....
Chọn/tạo bảng. ....
Điền vào các cài đặt nâng cao ..

Làm cách nào để nhập tệp CSV vào cơ sở dữ liệu ở Laravel?

Cách nhập tệp CSV / Excel trong Laravel..
Nhận tệp CSV/Excel.Nhận tệp CSV hoặc Excel bạn muốn tải nội dung của nó lên cơ sở dữ liệu.....
Tạo một ứng dụng Laravel mới.....
Tạo / di chuyển bảng.....
Tạo mô hình và bộ điều khiển ..
Tạo tệp lưỡi email.....
Đăng ký tuyến API.....
Bắt đầu máy chủ và kiểm tra ứng dụng trên Postman ..

Làm cách nào để nhập tệp CSV vào cơ sở dữ liệu MySQL?

Nhập tệp CSV bằng dòng lệnh..
Bước 1: Truy cập Shell MySQL.Truy cập cửa sổ thiết bị đầu cuối của bạn và đăng nhập vào MySQL bằng lệnh sau: MySQLTHERu Tên người dùng.....
Bước 2: Tạo bảng MySQL cho nhập CSV.....
Bước 3: Nhập CSV vào bảng MySQL ..