c++: ¿Cómo puedo leer rápidamente una matriz de un archivo?

CorePress2024-01-25  9

Cerrado. Esta pregunta necesita detalles o claridad. Actualmente no acepta respuestas.

¿Quieres mejorar esta pregunta? Añade detalles y aclara el problema editando esta publicación.

Cerrado

hace 2 años

.

mejorar esta pregunta

Tengo números almacenados en el archivo del formulario:

12766 961 2595
19427 11518 9233

Pero hay 400.000 conjuntos de este tipo. ¿Cómo puedo leerlos rápidamente desde un archivo?

ifstream file_for_reading("C:\Tests\21");
    short number_of_vertexes;
    int edge;
    file_for_reading >> number_of_vertexes >> edge;
    if (number_of_vertexes < 1 || number_of_vertexes > 30000 || edge < 0 || edge>400000) { cout << "Correct your vallues"; exit(1); };
    int tmp = 0;
    short i;
    short** matrix = new short* [edge];
    for (tmp = 0; tmp < edge; tmp++)
        matrix[tmp] = new short[3];
    unsigned int first_vertex, second_vertex, edge_size;
    i = 0;
    while (!file_for_reading.eof()) {
        for (tmp = 0; tmp < edge; tmp++) {
            file_for_reading >> matrix[tmp][i] >> matrix[tmp][i + 1] >> matrix[tmp][i + 2];
            i = 0;
        }
    }
    for (tmp = 0; tmp < edge; tmp++) {
        for (i = 0; i < 3; i++) {
            cout << matrix[tmp][i] << " ";
        }
        cout << endl;
    }
    file_for_reading.close();
    //Dijkstra(matrix, 0, number_of_vertexes);

3

Es mejor elegir un idioma. ¿Cómo planeas almacenar los números en la memoria? ¿Convertir el archivo a binario es una opción?

- Ninja retirado

28 de marzo de 2021 a las 8:40

1

¿A qué se traduce rápidamente? ¿No puedes usar operadores de transmisión? ¿Podrías agregar lo que probaste y descubriste que no funciona? Ayudaría.

-Zoso

28 de marzo de 2021 a las 8:43

1

¿Hay siempre tres números enteros por línea?

- Ted Lyngmo

28 de marzo de 2021 a las 8:44

1

¿Qué has probado? Sería inútil dar una respuesta utilizando una solución que ya has rechazado.

- Ted Lyngmo

28 de marzo de 2021 a las 8:51

1

Claro, pero ¿cómo lo hiciste? Por favor muestra tu código. ¿Se conoce el número de conjuntos en el archivo?

- Ted Lyngmo

28/03/2021 a las 9:10



------------------------------------

Si solo desea leer e imprimir, esta función le ayudará:

void readMatrix(int dimension, char *path, int *data)
{
    FILE *file;
    file = fopen(path, "r");
    if (file == NULL)
    {
        fprintf(stderr, "error: while trying to open `%s' for reading\n", path);
        return; //
    }

    for (int i = 0 ; ((i < dimension * dimension) && (fscanf(file, "%d ", &data[i]) == 1)) ; ++i)
        printf("data[%d] = %d\n", i, data[i]);

    fclose(file);
}



------------------------------------

¿Necesita definir qué es "leer rápidamente una matriz de un archivo"? significa para ti.

¿En qué ordenador, con qué sistema operativo, qué hardware?

Un enfoque posible, si el conjunto de datos se escribe una vez al día y la aplicación lo utiliza una docena de veces al día, es especificar algún formato binario (en algún documento escrito, utilizando la notación EBNF, inspirada en la especificación ELF). y convierta su archivo de texto en un archivo binario.

En Linux, podrías mmap(2) ese archivo binario. Véase también readahead(2) y posix_fadvise(2). En Windows, lea acerca de la asignación de archivos.

Si utiliza C <stdio.h> funciones, tenga en cuenta setvbuf(3). Desea tener (en 2021) buffers de E/S de al menos 64 kbytes (debido al caché de la página).

Considere también, si se le permite, convertir el archivo de texto a algún formato XDR. Existen generadores de código C o C++ para serializar y deserializar datos XDR. Véase también ASN.1

Otro enfoque podría ser dividir ese conjunto de datos en una docena de archivos de texto más pequeños (por ejemplo, usando utilidades como csplit(1) o su propio equivalente) y utilizar un enfoque de subprocesos múltiples (un subproceso lee cada archivo).

Un tercer enfoque estaría inspirado en los programas ensambladores: un primer paso simplemente analiza el final de las líneas y almacenaE archiva las compensaciones de ellos y, en una segunda pasada, utiliza varios subprocesos para analizar "segmentos" del archivo.

Mi opinión personal es que debes comparar y no molestarte.

Con los discos SSD (en un escritorio o servidor Linux típico en 2021), leer un millón de números enteros codificados en decimal dentro de archivos de texto podría tomar menos de un segundo de tiempo de CPU.

Y también puedes convertir (o almacenar) esos datos en alguna base de datos SQLite, PostGreSQL o REDIS.

Compartir mejorar esta respuesta Seguireditado

28 de marzo de 2021 a las 9:27

Respondido

28 de marzo de 2021 a las 8:49

Basile Starynkevitch

Basile Starynkevitch

1

2

1

Windows, SSD: 512 GB, me tomó 6 segundos leer esta matriz del archivo (1.200.000 elementos) usando la biblioteca fstream.

– Eugenos_Programos

28 de marzo de 2021 a las 9:08

2

Ehm, recientemente descubrí esto: "Deberías publicar también [X]" -- si la pregunta no tiene suficiente información, entonces no se debe responder todavía. Cómo responder

-MatG

28 de marzo de 2021 a las 9:12

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare