J'ai un programme C++ qui transpose une très grande matrice. La matrice est trop volumineuse pour être conservée en mémoire, donc j'écrivais chaque colonne dans un fichier temporaire séparé, puis concaténais les fichiers temporaires une fois que toute la matrice avait été traitée. Cependant, je constate maintenant que je me heurte au problème d'avoir trop de fichiers temporaires ouverts (c'est-à-dire que le système d'exploitation ne me permet pas d'ouvrir suffisamment de fichiers temporaires). Existe-t-il une méthode portable système pour vérifier (et, espérons-le, changer) le nombre maximum de fichiers ouverts autorisés? Je réalise que je pourrais fermer chaque fichier temporaire et ne le rouvrir que lorsque cela est nécessaire, mais je suis inquiet de l'impact sur les performances.Système C/C++ façon portable pour modifier le nombre maximum de fichiers ouverts
Mon code fonctionne comme suit (pseudo-code - pas garanti):
int Ncol=5000; // For example - could be much bigger.
int Nrow=50000; // For example - in reality much bigger.
// Stage 1 - create temp files
vector<ofstream *> tmp_files(Ncol); // Vector of temp file pointers.
vector<string> tmp_filenames(Ncol); // Vector of temp file names.
for (unsigned int ui=0; ui<Ncol; ui++)
{
string filename(tmpnam(NULL)); // Get temp filename.
ofstream *tmp_file = new ofstream(filename.c_str());
if (!tmp_file->good())
error("Could not open temp file.\n"); // Call error function
(*tmp_file) << "Column" << ui;
tmp_files[ui] = tmp_file;
tmp_filenames[ui] = filename;
}
// Stage 2 - read input file and write each column to temp file
ifstream input_file(input_filename.c_str());
for (unsigned int s=0; s<Nrow; s++)
{
int input_num;
ofstream *tmp_file;
for (unsigned int ui=0; ui<Ncol; ui++)
{
input_file >> input_num;
tmp_file = tmp_files[ui]; // Get temp file pointer
(*tmp_file) << "\t" << input_num; // Write entry to temp file.
}
}
input_file.close();
// Stage 3 - concatenate temp files into output file and clean up.
ofstream output_file("out.txt");
for (unsigned int ui=0; ui<Ncol; ui++)
{
string tmp_line;
// Close temp file
ofstream *tmp_file = tmp_files[ui];
(*tmp_file) << endl;
tmp_file->close();
// Read from temp file and write to output file.
ifstream read_file(tmp_filenames[ui].c_str());
if (!read_file.good())
error("Could not open tmp file for reading."); // Call error function
getline(read_file, tmp_line);
output_file << tmp_line << endl;
read_file.close();
// Delete temp file.
remove(tmp_filenames[ui].c_str());
}
output_file.close();
Un grand merci à l'avance!
Adam
portables du système dans un sens des fenêtres <-> * nix portables? Ne pensez pas que vous pouvez définir ce paramètre sur Windows. – RedX
Si vous stockez ces chiffres sous forme de texte, vous allez vraiment punir votre performance avec toutes les conversions de texte en valeurs numériques. – Andrew
Le format que je suis en train de lire est un format bioinformatique standardisé dans lequel les colonnes peuvent effectivement contenir divers nombres, chaînes de texte, etc. La conversion du texte en numérique est malheureusement inévitable. (Le format en question est ici: http://www.1000genomes.org/wiki/Analysis/Variant%20Call%20Format/vcf-variant-call-format-version-41) – Adam