cuốn sách gpt4 ai đã làm

Lưu trữ các bản ghi trong mảng byte so với sử dụng mảng cấu trúc

In lại Tác giả: Vũ trụ không gian Thời gian cập nhật: 2023-11-04 05:13:00 27 4
mua khóa gpt4 Nike

Tôi có 200 triệu bản ghi, một số trong đó có các trường có kích thước thay đổi (chuỗi, mảng có độ dài thay đổi, v.v.). Tôi cần thực hiện một số bộ lọc, tổng hợp, v.v. trên chúng (truy vấn hướng phân tích).

Tôi chỉ muốn nhét tất cả chúng vào bộ nhớ (đủ để nhét vào một chiếc hộp lớn) và quét tuyến tính chúng. Có hai cách tiếp cận tôi có thể thực hiện và tôi muốn nghe ý kiến ​​của bạn về cách nào tốt hơn để tối đa hóa tốc độ:

  1. sử dụngchar*int* Đang chờ mảng cấu trúc xử lý các trường có độ dài thay đổi
  2. Sử dụng mảng byte lớn, quét mảng byte như luồng nhị phân rồi phân tích bản ghi

Bạn muốn giới thiệu cách tiếp cận nào?

gia hạn:Sử dụng C

câu trả lời hay nhất

Không may thay,"Nó phụ thuộc vào chi tiết bạn không cung cấp", mặc dù đúng nhưng không đặc biệt hữu ích. Lời khuyên chung để giải quyết những vấn đề như thế này là hãy bắt đầu với thiết kế đơn giản/rõ ràng nhất, sau đó phân tích và tối ưu hóa nó nếu cần. nếu nóthực tếĐiều quan trọng là bạn phải thực hiện một số điểm chuẩn rất cơ bản trên một số thiết kế bằng cách sử dụng dữ liệu chính xác và các trường hợp sử dụng của mình để có ý tưởng chính xác hơn về hướng bạn nên thực hiện.

Một cái nhìn tổng quát về một số thiết kế cụ thể và一般Ưu điểm và nhược điểm:

một bộ đệm lớn

 char* pBuffer = malloc(200000000);
  • Giả sử dữ liệu của bạn có thể vừa với bộ nhớ cùng một lúc.
  • Hoạt động tốt hơn cho tất cả dữ liệu văn bản (hoặc chủ yếu là văn bản).
  • Đối với dữ liệu lớn, đây không phải là lựa chọn đầu tiên của tôi vì nó chỉ phản ánh dữ liệu trên đĩa. Tốt hơn là chỉ sử dụng bộ nhớ đệm/đọc trước tệp phần cứng/phần mềm và đọc dữ liệu trực tiếp từ ổ đĩa hoặc ánh xạ dữ liệu đó nếu cần.
  • Đây là một định dạng tốt để quét tuyến tính, nhưng nếu nó yêu cầu phân tích cú pháp phức tạp (đặc biệt nếu bạn phải thực hiện quét nhiều lần) thì bạn sẽ mất một chút.
  • Giả sử bạn có thể đóng gói các cấu trúc lần lượt thì chi phí có thể là tối thiểu.

cấu trúc tĩnh

 cấu trúc typedef {
char Dữ liệu1[32];
int Data2[10];
} myStruct;

myStruct *pData = malloc(sizeof(myStruct)*200000000);
  • Thiết kế đơn giản nhất, có lẽ là tốc độ tiềm năng tốt nhất nhưng lại tiêu tốn bộ nhớ (không cần phân tích thực tế).
  • Nếu mảng có độ dài thay đổi của bạn có nhiều kích cỡ khác nhau, bạn sẽ lãng phí rất nhiều bộ nhớ. Vì bạn có 200 triệu bản ghi nên có thể bạn không có đủ bộ nhớ để sử dụng phương pháp này.
  • Đối với quét tuyến tính, đây có lẽ là cấu trúc bộ nhớ tốt nhất nhờ tính năng lưu vào bộ nhớ đệm/tìm nạp trước.

cấu trúc động

 cấu trúc typedef {
char* pData1;
int* pData2;
} myStruct2;

myStruct2 *pData = malloc(sizeof(myStruct2)*200000000);
  • Đối với 200 triệu bản ghi, điều này sẽ yêu cầu nhiều phân bổ bộ nhớ động, điều này có thể có tác động đáng kể đến tốc độ.
  • Nếu mảng động của bạn có nhiều kích cỡ (xem điểm tiếp theo), bạn có thể cải thiện hiệu quả bộ nhớ.
  • Lưu ý kích thước con trỏ trên đầu. Trên hệ thống 32 bit, cấu trúc này yêu cầu 8 byte (bỏ qua phần đệm) để lưu trữ con trỏ, với 200 triệu bản ghi chỉ là 1,6 GB! Nếu mảng động của bạn thường nhỏ (hoặc trống), bạn có thể phải tốn nhiều chi phí! nhiều bộ nhớ hơn dữ liệu thực tế.
  • Loại cấu trúc này có thể không hoạt động tốt khi quét dữ liệu tuyến tính vì bạn đang truy cập bộ nhớ theo cách phi tuyến tính mà trình tìm nạp trước không thể dự đoán được.

phát trực tuyến

  • Nếu bạn chỉ cần thực hiện một lần quét dữ liệu thì tôi sẽ xem xét giải pháp phát trực tuyến trong đó bạn đọc một phần nhỏ dữ liệu từ tệp cùng một lúc.
  • Thích hợp cho các tập dữ liệu rất lớn không thể chứa vừa trong bộ nhớ.
  • Những hạn chế chính ở đây là tốc độ đọc đĩa và độ phức tạp của việc phân tích cú pháp.
  • Ngay cả khi bạn phải thực hiện nhiều lần chuyển tới bộ đệm tệp, tốc độ này có thể sẽ tương đương với các phương pháp khác.

Cái nào trong số này là "tốt nhất" thực sự phụ thuộc vào tình huống cụ thể của bạn... Tôi có thể nghĩ ra các tình huống trong đó mỗi phương pháp sẽ là phương pháp ưu tiên.

Về c - lưu trữ các bản ghi trong mảng byte so với việc sử dụng mảng cấu trúc, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/25685795/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress