2016-02-03 10 views
7

Pracuję z zestawem danych, który ma kilka kolumn reprezentujących liczby identyfikatorów całkowitych (np. TransactionId i accountId). Te numery ID mają często długość 12 cyfr, co czyni je zbyt dużymi, aby można je było zapisać jako 32-bitową liczbę całkowitą.W R lepiej używać liczb całkowitych64, liczbowych lub znakowych dla dużych liczb całkowitych?

Jakie jest najlepsze podejście w takiej sytuacji?

  1. Odczytaj ID jako ciąg znaków.
  2. Odczytaj ID jako liczbę całkowitą64, używając pakietu bit64.
  3. Odczytaj identyfikator jako numeryczny (tj. Podwójny).

I zostali ostrzeżeni o niebezpieczeństwach równości testowanie z deblu, ale nie jestem pewien, czy to będzie problem w kontekście wykorzystania ich jako identyfikatorów, gdzie może scalić i filtrów opartych na nich, ale nigdy nie wykonuj arytmetyki na numerach identyfikacyjnych.

Ciągi znaków wydają się intuicyjnie podobne do woli, aby testować równość i scalać, ale być może w praktyce nie ma to większego znaczenia.

+3

Pojęciowo są to znaki (lub nawet zmienna czynnikowa) i traktuję je jako takie. Scalanie danych z kluczem znakowym odbywa się bardzo szybko. – Roland

Odpowiedz

4

Jeśli wydajność jest po użyciu bit64.

wektorami „integer64” można przechowywać bardzo duże liczby całkowite kosztem 64 bitów, czyli o czynnik 7 lepszy niż „Int64” z pakietu „Int64”. Ze względu na mniejszy rozmiar pamięci, architekturę wektorów atomowych i używanie tylko klas S3 zamiast S4, większość operacji jest jednością do o trzy rzędy wielkości szybsza: Przykładowe przyspieszenia to 4x dla serializacji, 250x dla dodawania, 900x dla przymusu i 2000x do tworzenia obiektów. Również "integer64" pozwala uniknąć ciągłej (potencjalnie nieskończonej) kary za usuwanie śmieci obserwowanej podczas istnienia obiektów "int64" (patrz kod w przykładzie ).

Zobacz następujący PDF: https://cran.r-project.org/web/packages/bit64/bit64.pdf

2

widoczny komentarz Rolanda do pierwotnego pytania. Twoje ID powinny być wektorami znaków. Ponieważ jest bardzo mało prawdopodobne, aby identyfikatory były używane do operacji matematycznych, ogólnie jest bezpieczniejsze zapisywanie wartości jako wektorów znaków. Podkreśla również, że szybkość łączenia się w data.table za pomocą wektorów znaków jest bardzo szybka. Być może nie tak szybko, jak integer łączy, ale mimo to szybko. W większości przypadków powinno to być w porządku.

+2

"Ponieważ jest bardzo mało prawdopodobne, aby identyfikatory były używane do operacji matematycznych, ogólnie bezpieczne jest przechowywanie wartości jako wektorów znaków." Nie tylko tak bezpiecznie, ale * bezpieczniej *, ponieważ jeśli przypadkowo zrobisz coś matematycznego z identyfikatorem, jak "lapply (DF, mediana)", błąd łatwiej złapać. – Frank

Powiązane problemy