Je pense que la réponse est oui, vous avez bien lu des milliards de lignes en utilisant readLine
, à moins que vous pensez que ça vaut la peine utilisant
- la stratégie définie par GREGS, qui est l'estimation de la longueur de la ligne et l'utilisation que pour commencer à lire quelque part près de la ligne correcte, ou
vous utilisez un index séparé, soit au début du fichier ou dans un fichier séparé qui est très prévisible et est quelque chose comme
0000001 000000001024
0000002 000000001064
0000003 000000002010
C'est le numéro de ligne et la position de départ de cette ligne en octets d'une manière strictement définie qui permet de déterminer la position de l'index par quelque chose comme:
Je veux lire la ligne 3, donc je trouve la position de la ligne 3 en allant à la position (3-1) * 20, et lire 0000003 000000002010
, analyser cela et savoir que la ligne 3 est à la position d'octet 2010, chercher cette position et commencer à lire.
Il peut être difficile de calculer ou de conserver l'index s'il se trouve dans le fichier de données principal, car cela signifie que vous précalculerez les positions avant d'écrire le fichier. Je pense que j'utiliserais un fichier d'index séparé et calculerais des index pendant l'écriture, ou aurais un utilitaire séparé pour créer un fichier d'index donné à un fichier de données.
EDIT exemple de code Ajouté à démontrer ma proposition
J'ai fait un script Python plutôt petit qui lit un fichier de données et crée un fichier d'index. Le fichier d'index contient la position d'une ligne dans le fichier de données et est conçu pour être facilement consultable.
Cet exemple de script a un formatage d'index de 06d, ce qui est assez bon pour 999.999 fichiers de données de ligne, pour vous, il pourrait avoir à être ajusté (ne pas oublier INDEX_LENGTH). Il crée un fichier d'index, et utilise ce fichier d'index pour lire une ligne donnée sur le fichier de données (à des fins de démonstration, vous devez utiliser java pour cette partie :)
Le script est appelé comme:
python create_index.py data.txt data.idx 3
mon exemple fichier de données est:
#1{1,12,345,867}
#2{123, 3243534, 2132131231}
#3{234, 35345}
#4{}
et le script lui-même est:
import sys
# Usage: python this_script.py datafile indexfile lineno
# indexfile will be overwritten
# lineno is the data line which will be printed using the
# index file, as a demonstration
datafilename= sys.argv[1]
indexfilename = sys.argv[2]
lineno = int(sys.argv[3])
# max 999999 lines in this format
format = "%06d\n"
INDEX_LENGTH = 6+1 # +1 for newline
def create_indexfile():
indexfile = open(indexfilename, "wB")
# Print index of first line
indexfile.write(format % 0)
f = open(datafilename, "rB")
line = f.readline()
while len(line) > 0:
indexfile.write(format % f.tell())
line = f.readline()
f.close()
indexfile.close()
# Retrieve the data of 1 line in the data file
# using the index file
def get_line():
linepos = INDEX_LENGTH * (lineno - 1)
indexfile = open(indexfilename, "rB")
indexfile.seek(linepos)
datapos = int(indexfile.readline())
indexfile.close()
datafile = open(datafilename, "rB")
datafile.seek(datapos)
print datafile.readline()
datafile.close()
if __name__ == '__main__':
create_indexfile()
get_line()
Le fichier d'index doit être reconstruit après une modification dans le fichier de données. Vous pouvez vérifier si vous avez lu les bonnes données en comparant votre numéro de ligne à partir des données lues (# 3 {...}) avec le numéro de ligne d'entrée, donc c'est assez sûr.
Que vous choisissiez de l'utiliser ou non, je pense que l'exemple est assez clair et facile.
Je ne suis pas sûr si je pourrais utiliser cette stratégie avec un tel fichier d'information. La fonction seek (arg) fonctionne avec l'argument "long", de sorte que je ne peux utiliser que 2^63-1 symboles.Mais si je dois lire la dernière corde et qu'il y a des milliards de grosses cordes, je pense qu'il y aurait beaucoup plus de symboles ... Que faire? – Dmitry
Eh bien, peut-être que j'ai pris la mauvaise stratégie. Ma tâche est la suivante: je dois programmer l'algorithme de quatre Russes pour multiplier 2 matrice booléenne. Ces matrices sont vraiment énormes (comme je le disais, des milliards de grosses cordes)! J'ai choisi la représentation. où les nombres entre {} indiquent les endroits où les 1 restent. Selon cet algorithme, j'ai besoin d'ajouter deux chaînes de ce type (ces chaînes localisent dans un fichier). Je veux rechercher deux chaînes puis enregistrer une partie de chacune d'entre elles dans un tampon (ArrayList), puis ajouter ces parties selon une certaine règle, puis enregistrer le résultat dans un fichier résultat spécial. Donc, j'ai besoin de rechercher ces deux chaînes –
Dmitry
Mon être là est une autre façon de représenter une matrice, ce qui aidera à rechercher les chaînes nécessaires ??? – Dmitry