2012-09-28 36 views
6

Tôi hiện đang điều tra cách sử dụng Hướng dẫn xử lý văn bản và chuỗi SSE 4.2 STTNI (http://software.intel.com/en-us/articles/xml-parsing-accelerator-with- intel-streaming-simd-extensions-4-intel-sse4 /) để phân tích cú pháp tệp CSV hiệu quả.Phân tích cú pháp tệp CSV SSE 4.2

Câu hỏi của tôi là nếu điều này đã được thử trước khi phân tích CSV tệp CSV/trong bộ nhớ và nếu các ví dụ có sẵn trực tuyến? Cho đến nay tôi đã không thành công trong việc tìm kiếm tài nguyên tốt (ngoại trừ bài viết của Intel đã đề cập ở trên) về cách sử dụng SSE 4.2 để phân tích cú pháp văn bản.

Chiến lược hiện tại tôi đang cố gắng là, đối với mỗi 16 byte, tạo ra 4 bitmasks:

  • một phù hợp với từng nhân vật chống lại delimiter
  • một phù hợp với từng nhân vật chống lại kí tự xuống dòng
  • một đối sánh với mỗi ký tự đối với ký tự ngoặc kép (chuỗi); và
  • một phù hợp với từng nhân vật chống lại các ký tự thoát (thoát delimiter, dòng mới, dấu ngoặc kép)

với các thông tin đã đạt được bởi các bitmasks nó rất dễ dàng để xác định hiệu số và độ dài cho mỗi giá trị trong CSV.

+2

Lưu ý rằng ký tự ngoặc kép có khả năng được thoát ra, điều này có thể khó xử lý với cách tiếp cận bạn phác thảo. –

+0

Từ một câu trả lời chỉ có liên kết đã bị xóa: Có triển khai hoạt động (nhưng không sẵn sàng sản xuất) trên [github: 'csvmonkey'] (https://github.com/dw/csvmonkey). Thư viện chỉ có tiêu đề C++. Nó nhanh nhưng "Bây giờ nó chủ yếu là mã đồ chơi." Có thể là một điểm khởi đầu tốt, ngoại trừ không có giấy phép được liệt kê. –

Trả lời

5

Tại sao bạn sử dụng bitmap? Nó sẽ không được tốt hơn để kiểm tra tất cả những sự kiện đó với một lệnh STTNI duy nhất và sau đó sử dụng chỉ số trả về để xử lý sự kiện trả về (nếu có)?

(chỉnh sửa) hãy để tôi cố gắng thể hữu ích hơn ...

(Tôi sẽ giả sử bạn đang sử dụng chuỗi null chấm dứt các ký tự 8-bit. Hãy cho tôi biết nếu đó không phải là trường hợp.)

Tôi nghĩ bạn nên đặt dấu phân cách, dòng mới, báo giá và thoát vào một thanh ghi đơn (dưới dạng chuỗi bị hủy) và sử dụng PCMPISTRI thay cho PCMPISTRM bằng mỗi giá trị. Đối với từ kiểm soát bạn sẽ muốn chỉ ra: byte chưa ký, bằng bất kỳ, cực dương, ít nhất. (Chắc chắn là tôi có quyền đó.)

Sau đó, bạn có thể sử dụng JA để kiểm tra đồng thời xem có bất kỳ ký tự đặc biệt nào bị trúng hay kết thúc chuỗi. Nếu vậy, thoát khỏi vòng lặp để đối phó với nó. Nếu không, hãy thêm ECX vào con trỏ xmm2/m128 và quay trở lại PCMPISTRI.

Hướng dẫn mã đầu tiên để xử lý "lần truy cập" là thêm ECX vào con trỏ xmm2/m128, sau đó xử lý từng khả năng lần lượt. Tôi đề nghị đặt hàng chúng từ nhiều khả năng ít nhất.

Vì vậy, asm nên kết thúc tìm kiếm một cái gì đó như:

XOR  ECX, ECX 

TAG1: 
    ADD  EAX, ECX 
    PCMPISTRI XMM1, [EAX], 0x0  ; also writes ECX = index 
    JA  TAG1 

ADD  EAX, ECX 
CMP  BYTE PTR[EAX], "delimiter" 
JE  "handle delimiter" 
CMP  BYTE PTR[EAX], "newline" 
JE  "handle newline" 
CMP  BYTE PTR[EAX], "quotation" 
JE  "handle quotation" 
CMP  BYTE PTR[EAX], "escape" 
JE  "handle escape" 
CMP  BYTE PTR[EAX], "end of string" 
JE  "handle end of string" 

tôi sẽ cho bạn quyết định những gì để tốt nhất cho delimiters thử nghiệm là. :)

Khi tôi đã phát triển các hướng dẫn tôi đã sử dụng để có thể nhận được trình biên dịch tạo mã asm ở trên bằng cách sử dụng nội tại. Nó đã được một thời gian kể từ khi tôi đã làm việc với các hướng dẫn mặc dù vậy không chắc chắn nếu trình biên dịch trung bình sẽ làm tốt hay không. (sẽ rất thú vị khi nghe kết quả bạn nhận được.)


Bằng cách này, các phiên bản mặt nạ của các hướng dẫn làm có tất cả các loại sử dụng, họ chỉ cần không phải là lựa chọn tốt nhất cho việc tìm kiếm đầu tiên hoặc cuối cùng của một cái gì đó từ chữ "I" phiên bản của các hướng dẫn sẽ tính toán bù đắp cho bạn. Các phiên bản mặt nạ là tốt cho đếm hoặc chỉ xử lý các mặt hàng nhất định trong số những thứ khác kỳ lạ hơn. ngay bây giờ tôi đang sử dụng chúng để đếm A, C G, và T trong chuỗi DNA.

+0

Cảm ơn Mike, điều này thật tuyệt vời! Tôi sẽ giữ cho bạn cập nhật những gì tôi có thể nghĩ ra. – muehlbau

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