2013-08-18 23 views
6

Từ data.table dẫn sử dụng:lý do tại sao "nhân vật thường được ưu tiên yếu tố" trong data.table cho khóa?

Trong thực tế, chúng tôi thích nó rất nhiều mà data.table chứa một loại đếm thuật toán cho vectơ nhân vật sử dụng nội bộ chuỗi toàn cầu bộ nhớ cache R. Điều này đặc biệt nhanh đối với các vectơ ký tự chứa nhiều các bản sao, chẳng hạn như dữ liệu được nhóm trong cột khóa. Điều này có nghĩa là ký tự thường được ưu tiên hơn. Các yếu tố vẫn còn đầy đủ được hỗ trợ, trong các yếu tố đặt hàng cụ thể (trong đó các cấp không nằm trong số thứ tự chữ cái).

Không phải là factor chỉ là số nguyên cần dễ dàng hơn để làm counting sort hơn character?

+7

Tôi nghĩ rằng điều này có thể giúp đỡ từ Data.table FAQ 2.17 'Vì bộ đệm chuỗi toàn cục được thêm vào R, các ký tự là một con trỏ tới bộ nhớ đệm đơn. chuỗi và không còn hiệu suất của việc coverting thành yếu tố' nữa. – agstudy

Trả lời

8

Yếu tố không phải chỉ là số nguyên, việc đếm đếm có dễ hơn không?

Có, nếu bạn đã có một yếu tố rồi. Nhưng thời gian để tạo ra yếu tố đó có thể là đáng kể và đó là những gì setkey (và ad hoc by) nhằm mục đích để đánh bại. Hãy thử thời gian factor() trên một vector ký tự được sắp xếp ngẫu nhiên, nói 1e6 dài với mức 1e4. Sau đó, so sánh với setkey hoặc ad hoc by trên vectơ ký tự được sắp xếp ngẫu nhiên ban đầu.

nhận xét của agstudy cũng chính xác; tức là, các vectơ ký tự (là con trỏ tới chuỗi R được lưu trong bộ nhớ cache) khá giống với các thừa số. Trên hệ thống 32 bit, các vectơ ký tự có cùng kích thước với vectơ số nguyên của hệ số nhưng hệ số có thuộc tính mức để lưu trữ (và đôi khi sao chép). Trên hệ thống 64bit, con trỏ lớn gấp hai lần. Nhưng mặt khác, bộ nhớ đệm chuỗi của R có thể được tra cứu trực tiếp từ các con trỏ vector ký tự, trong khi nhân tố có thêm một bước nhảy qua các mức. (Thuộc tính mức là một vectơ ký tự của các con trỏ trong bộ nhớ đệm R.)

Các vấn đề liên quan