2016-02-03 19 views
7

Sto lavorando con un set di dati che ha diverse colonne che rappresentano numeri interi di numeri interi (ad esempio transactionId e accountId). Questi numeri ID sono spesso di 12 cifre, il che li rende troppo grandi per essere archiviati come un numero intero a 32 bit.In R è meglio usare integer64, numerico o carattere per numeri interi di numeri interi grandi?

Qual è l'approccio migliore in una situazione come questa?

  1. Leggere l'ID come stringa di caratteri.
  2. Leggere l'ID come numero intero64 utilizzando il pacchetto bit64.
  3. Leggere l'ID come numerico (vale a dire doppio).

Sono stato avvisato dei pericoli di testare l'uguaglianza con il doppio, ma non sono sicuro se questo sarà un problema nel contesto del loro utilizzo come ID, dove potrei unire e filtrare in base ad essi, ma mai fare aritmetica sui numeri ID.

Le stringhe di caratteri sembra intuitivamente come dovrebbe essere più lento di prova per l'uguaglianza e fare fonde, ma forse, in pratica, non fa molta differenza.

+3

concettualmente questi sono personaggi (o anche una variabile fattore) e io li trattano come tale. Un'unione data.table con una chiave di carattere è molto veloce. – Roland

risposta

4

Se le prestazioni si sono dopo l'uso bit64.

con vettori ‘integer64’ è possibile memorizzare interi elevati a scapito di 64 bit, che è di un fattore 7 meglio di ‘Int64’ dal pacchetto ‘Int64’. A causa dell'impronta di memoria più piccola, l'architettura vettoriale atomica e utilizzando solo S3 invece di classi S4, la maggior parte delle operazioni è da 1 a tre ordini di grandezza più veloci: velocità di esempio 4x per serializzazione, 250x per l'aggiunta, 900x per coercizione e 2000x per la creazione di oggetti. Anche ‘integer64’ evita un continuo (potenzialmente infinito) pena per il garbage collection osservato durante esistenza di oggetti ‘Int64’ (vedere codice di esempio nella sezione ).

vedere il seguente PDF: https://cran.r-project.org/web/packages/bit64/bit64.pdf

2

See commento di Roland alla domanda iniziale. I tuoi ID dovrebbero essere vettori di caratteri. Poiché è molto improbabile che gli ID vengano utilizzati per operazioni matematiche, in genere è più sicuro memorizzare il valore come vettori di caratteri. Sottolinea inoltre che la velocità di fusione in data.table utilizzando i vettori di caratteri è molto veloce. Forse non veloce quanto l'integrazione di un numero intero, ma comunque veloce. Nella maggior parte dei casi questo dovrebbe essere a posto.

+2

"Poiché è molto improbabile che gli ID vengano utilizzati per operazioni matematiche, è generalmente sicuro memorizzare il valore come vettori di caratteri." Non solo sicuro, ma * più sicuro *, poiché se accidentalmente fai qualcosa di matematico con l'ID, come 'lapply (DF, mediana)', l'errore è più facile da cogliere. – Frank

Problemi correlati