j'ai des fichiers texte CSV dans le format:Convertir un texte CSV fichier binaire et obtenir une ligne au hasard à partir en Python sans le lire à la mémoire
1.3, 0, 1.0
20.0, 3.2, 0
30.5, 5.0, 5.2
Les fichiers sont sur 3.5GB taille et I Je ne peux pas lire l'un d'entre eux dans la mémoire de Pandas dans un laps de temps utile.
Mais je n'ai pas besoin de lire tout le fichier, car ce que je veux faire, c'est choisir des lignes aléatoires du fichier et lire les valeurs, et je sais qu'il est théoriquement possible de le faire si le fichier est formaté de manière à ce que tous les champs aient la même taille - par exemple, float16 dans un fichier binaire.
Maintenant, je pense que je peux le convertir, en utilisant la méthode NumPy spécifiée dans la réponse à la question: How to output list of floats to a binary file in Python
Mais, comment dois-je aller à ramasser une ligne au hasard à partir après la conversion est effectuée ?
Dans un fichier texte normal, je pouvais faire:
import random
offset = random.randrange(filesize)
f = open('really_big_file')
f.seek(offset) #go to random position
f.readline() # discard - bound to be partial line
random_line = f.readline() # bingo!
Mais je ne peux pas trouver un moyen pour que cela fonctionne dans un fichier binaire fabriqué à partir NumPy.
@TimPietzcker - N'est-ce pas ce que fait le fragment de code? Bien sûr, avec cette approche vous éliminez la possibilité de choisir la première ligne ... – mgilson
Non, parce que les lignes dans le texte original CSV, ont une longueur différente, et en tant que tel, j'obtiendrais un biais qui favoriserait les plus grandes lignes pour obtenir ramassé à la place des plus petits. (c'est-à-dire, dans les données d'exemple, la troisième ligne aurait une probabilité de 30% plus élevée d'être choisie que la première.) – jbssm
@jbssm - Hmm ... Point intéressant. – mgilson