Je dois lire un fichier texte volumineux (> 200 000 mots) et traiter chaque mot. Je lis dans le fichier entier dans une chaîne, puis attacher un flux de chaîne pour traiter facilement chaque mot. L'approche consiste à saisir directement chaque mot du fichier en utilisant <<
et à le traiter mais comparer les deux approches ne me donne aucun avantage en termes de temps d'exécution. N'est-il pas plus rapide d'utiliser une chaîne en mémoire que d'un fichier qui a besoin d'un appel système chaque fois que j'ai besoin d'un mot? S'il vous plaît suggérer des méthodes améliorant la performance.Performances des flux de chaînes par rapport aux flux d'E/S de fichiers en C++
Répondre
La mise en cache est impliquée, donc elle n'effectue pas nécessairement un appel système à chaque extraction. Cela dit, vous pouvez obtenir des performances légèrement meilleures au moment de l'analyse en analysant un seul tampon contigu. D'un autre côté, vous êtes en train de sérialiser la charge de travail (lire le fichier entier, puis analyser), qui peut potentiellement être parallélisé (lire et analyser en parallèle).
La chaîne sera réaffectée et copiée énormément de fois pour accommoder 200 000 mots. C'est probablement ce qui prend le temps.
Vous devriez utiliser une corde si vous voulez créer une énorme chaîne en ajoutant.
Cela pourrait devenir une bonne réponse si vous avez suggéré une solution. –
Si vous allez mettre les données dans un stringstream de toute façon, il est probablement un peu plus rapide et plus facile à copier directement à partir du flux d'entrée dans le flux de la chaîne:
std::ifstream infile("yourfile.txt");
std::stringstream buffer;
buffer << infile.rdbuf();
Le ifstream
utilisera un tampon Cependant, même si c'est probablement plus rapide que de lire une chaîne, puis de créer une chaîne, il ne sera peut-être pas plus rapide que de travailler directement à partir du flux d'entrée.
Si d'autres E/S se déroulent parallèlement à ce traitement, la charge de données unique sera préférable car la tête de disque n'a pas la même possibilité de passer d'une actualisation de tampon à une autre. –
@Steve: Je n'avais pas pensé à ça, mais c'est un bon point. –
Je pense que cela combiné avec la réponse de Martin au q précédent sera le meilleur. Je vous ai donné +1 pour les meilleures infos locales –
Pour des performances et la copie minimum, cela est difficile à battre (aussi longtemps que vous avez assez de mémoire!):
void mapped(const char* fname)
{
using namespace boost::interprocess;
//Create a file mapping
file_mapping m_file(fname, read_only);
//Map the whole file with read permissions
mapped_region region(m_file, read_only);
//Get the address of the mapped region
void * addr = region.get_address();
std::size_t size = region.get_size();
// Now you have the underlying data...
char *data = static_cast<char*>(addr);
std::stringstream localStream;
localStream.rdbuf()->pubsetbuf(data, size);
// now you can do your stuff with the stream
// alternatively
}
flux
- 1. chaînage des flux C++
- 2. Performances des comparaisons de chaînes supplémentaires par rapport aux recherches HashMap
- 3. Utilisation des flux en Java
- 4. Performances de CALayer par rapport aux performances UIImageView
- 5. Comment gérer les accès simultanés aux fichiers avec un flux de fichiers/flux de données?
- 6. écrire des «bits» dans les flux de fichiers C++
- 7. Conversion de flux de fichiers jpg en flux FLV
- 8. Flux de fichiers plus importants utilisant C#
- 9. Comment est l'interface graphique et le flux de programmes de jeu par rapport aux programmes Web
- 10. Comment fonctionne l'optimisation des performances de la matrice crénelée C# 3.0 par rapport aux baies rectangulaires?
- 11. comment restaurer une sauvegarde de serveur sql contenant des données de flux de fichiers en attribuant un nouveau nom de dossier aux données de flux de fichiers?
- 12. Gestion des flux RSS
- 13. Recueillir des données de Google Résultat flux
- 14. surcharge flux en C++
- 15. Flux C++ Boost io, gestion des erreurs
- 16. Accès aux flux de données alternatifs dans les fichiers
- 17. Liste des flux rss pour tester mon lecteur de flux
- 18. Convertir le flux RTF en flux de texte brut
- 19. Chaîne flux en C
- 20. Performances du type de référence de tri par rapport aux types de valeur
- 21. Gestion des données de flux de paiement
- 22. Obtenir des longueurs de flux MP4
- 23. Rediriger un flux de fichier dans le flux mémoire
- 24. Performances de repaint/reflow du navigateur: utilisation des dégradés CSS3 par rapport aux dégradés PNG
- 25. Variables par rapport aux constantes par rapport aux tableaux associatifs en PHP
- 26. Améliorer les performances de tri des fichiers par extension
- 27. Indexer les performances nulles par rapport aux données fictives
- 28. Flux de wrapper SSL en C
- 29. Clearcase UCM: comment trouver des versions dans le flux A créé en fusionnant du flux B
- 30. Traitement de flux asynchrone en Python
fait une mise en mémoire tampon interne. Fiddle avec la taille du tampon pour trouver un ajustement optimal. – codymanix
Voir la réponse @Martin York ici pour une «chaîne du fichier» qui minimise la copie - http://stackoverflow.com/questions/132358/how-to-read-file-content-into-istringstream –
J'étais sur le point de suggérer que . –