Cómo puedo hacer el archivo múltiple de `segmentsize` [cerrado] -- ++ campo con file campo con stream camp codereview Relacionados El problema

How I can make file multiple of `segmentSize` [closed]


0
vote

problema

Español
cerrado . Esta pregunta necesita detalles o claridad . Actualmente no está aceptando respuestas.

¿Quieres mejorar esta pregunta? Añadir detalles y aclarar el problema por Edición de esta publicación .

cerrado hace 3 años .

Mejorar esta pregunta

I Multiplicando el archivo original y recortar una pieza de archivo final con la intención de hacerlo un múltiplo de 9988776665544330 con la pérdida mínima de datos.

Ejemplo: Tengo un tamaño de archivo de 4 bits, y tamaño de segmento de 3 bits; Hago mi original en 3 veces o 6 y tan lejos.

u otro ejemplo: Tengo un tamaño de archivo de 48 000 000 y segmento (1024 * 1024 * 6 * 2) y si multiplico el archivo original por 5 (haga un archivo que contenga 5 archivos originales en fila) (48 000 000 * 5) / (1024 * 1024 * 6 * 2) = 19.0734 ... 1 - Tendré solo 0.7% de pérdida. Y luego hago mi archivo extendido (cinco veces de originales) al copiar el archivo original en Temp.iqbin 5 veces, y después de leer el segmento (1024 * 1024 * 6 * 2) de Temp.iqbin y escríbalo en mi final.iqbin (Hago esto 19 veces en el último ciclo) y obtengo un archivo final que es múltiple de segmentSize (porque recorté algunos datos por No copiarlo desde Temp.iqbin tamaño).

      double criteria = 0;     int arraySize = 0;      double box = 1;     int box_i = 0;     double coeff;     int sizeFactor;     if (size < 1300000)         sizeFactor = 8;     else         sizeFactor = 2;      //if original file too big, reduce the extend coeff     if (size < segmentSize) {         coeff = segmentSize / size;         coeff = (int)coeff;     }     else         coeff = 0;      //optimization by criteria of minimum data loss in final file     for (int i = 1; i < 4*sizeFactor; i++) {         criteria = (size*(i+coeff)) / segmentSize;         criteria = criteria - int(criteria);         box = box < criteria ? box : criteria;         box_i = box < criteria ? box_i : i+coeff;     }      std::vector<char> vector(segmentSize);      //Remove old Temp file     std::remove("Temp.iqbin");     std::fstream ofs1("Temp.iqbin", std::ios::binary | std::ios::out | std::ios::app | std::ios::in);     fs.seekg(0, std::ios::beg);      //i do the file that is multiple of original file in box_i (the size     //which guarantee minimum data loss after trim) times     for (int i = 0; i < box_i; i++) {         ofs1 << fs.rdbuf();         fs.seekg(0, std::ios::beg);     }      //back to beginning of file     ofs1.seekg(0, std::ios::beg);     //remove old final.iqbin     std::remove("final.iqbin");     std::ofstream ofs("final.iqbin", std::ios::binary | std::ios::out |std::ios::app);     //Write Segments one by one to final.iqbin file     //i read segments(have size i want new file was multiple of) and write     //it to the newfile     coeff = ((size*box_i) / segmentSize);     for (int i = 0; i < (int)coeff; i++) {         //Read Segment from Temp file         ofs1.read(&vector[0], segmentSize);         //Write Segment to final.iqbin file         ofs.write(&vector[0], segmentSize);     }     ofs1.close();     //remove Temp file     std::remove("Temp.iqbin");   

Este código está funcionando e incluso funciona rápidamente para los archivos que me alimento, pero creo que no es la solución óptima.

Original en ingles

I multiply the original file and cut a piece of final file with intention to do it a multiple of segmentSize times with minimum loss of data.

Example: I have a file size of 4 bits, and segment size of 3 bits; I do extend my original in 3 times or 6 and so far and so forth.

or another example: I have file size of 48 000 000 and segment (1024*1024*6*2) and if I multiply the original file by 5 (make file that was contain 5 original files in row) (48 000 000 * 5)/(1024*1024*6*2) = 19.0734...1 -- I will have only 0.7% loss. And then I make my extended file (five times of original) by copying original file into Temp.iqbin 5 times, and after read the segment (1024*1024*6*2) from Temp.iqbin and write it into my final.iqbin (I do this 19 times in the last cycle) and I get Final file that is multiple of segmentSize (because I trimmed some data by not copying it from Temp.iqbin size).

    double criteria = 0;     int arraySize = 0;      double box = 1;     int box_i = 0;     double coeff;     int sizeFactor;     if (size < 1300000)         sizeFactor = 8;     else         sizeFactor = 2;      //if original file too big, reduce the extend coeff     if (size < segmentSize) {         coeff = segmentSize / size;         coeff = (int)coeff;     }     else         coeff = 0;      //optimization by criteria of minimum data loss in final file     for (int i = 1; i < 4*sizeFactor; i++) {         criteria = (size*(i+coeff)) / segmentSize;         criteria = criteria - int(criteria);         box = box < criteria ? box : criteria;         box_i = box < criteria ? box_i : i+coeff;     }      std::vector<char> vector(segmentSize);      //Remove old Temp file     std::remove("Temp.iqbin");     std::fstream ofs1("Temp.iqbin", std::ios::binary | std::ios::out | std::ios::app | std::ios::in);     fs.seekg(0, std::ios::beg);      //i do the file that is multiple of original file in box_i (the size     //which guarantee minimum data loss after trim) times     for (int i = 0; i < box_i; i++) {         ofs1 << fs.rdbuf();         fs.seekg(0, std::ios::beg);     }      //back to beginning of file     ofs1.seekg(0, std::ios::beg);     //remove old final.iqbin     std::remove("final.iqbin");     std::ofstream ofs("final.iqbin", std::ios::binary | std::ios::out |std::ios::app);     //Write Segments one by one to final.iqbin file     //i read segments(have size i want new file was multiple of) and write     //it to the newfile     coeff = ((size*box_i) / segmentSize);     for (int i = 0; i < (int)coeff; i++) {         //Read Segment from Temp file         ofs1.read(&vector[0], segmentSize);         //Write Segment to final.iqbin file         ofs.write(&vector[0], segmentSize);     }     ofs1.close();     //remove Temp file     std::remove("Temp.iqbin"); 

This code is working and it even works fast for files that I feed to it, but I think it's not the optimal solution.

        
         
         

Lista de respuestas

1
 
vote
vote
La mejor respuesta
 

En la medida en que pueda entender (o mejor decir: adivinar) lo que quiere decir, la solución óptima es un tamaño de archivo igual al múltiplo menos común del tamaño de datos dado y el tamaño del segmento: Multiplique su archivo n veces: < / p>

$ n = {segmentsize} / operatorname {gcd} ({dataSize}, {segmentsize}) $

para que obtengas un archivo de tamaño

$ s = operatorname {lcm} ({dataSize}, {segmentsize}) $

que es $ m $ segmentos completos:

$ m = {DataSize} / operatorname {GCD} ({DataSize}, {segmentsize}) $

Para el tamaño de los datos 48 millones y el tamaño del segmento 12 Meg El mayor divisor común es 3,072 = 3 * 1024, por lo que su múltiplo menos común es:
$ 196,608,000,000 = 2 ^ {12} veces DataSize = 5 ^ 6 Times Segmentsize. $

 

As far as I can understand (or better say: guess) what you mean, the optimum solution is a file size equal to the least common multiple of the given data size and the segment size: multiply your file N times:

\$ N = {segmentSize} / \operatorname{gcd}({dataSize}, \ {segmentSize}) \$

so you get a file of size

\$S = \operatorname{lcm}({dataSize}, \ {segmentSize})\$

which is \$M\$ full segments:

\$M = {dataSize} / \operatorname{gcd}({dataSize}, \ {segmentSize}) \$

For data size 48 million and segment size 12 Meg the greatest common divisor is 3,072 = 3*1024, so their least common multiple is:
\$196,608,000,000 = 2^{12} \times datasize = 5^6 \times segmentsize.\$

 
 
     
     

Relacionados problema

6  Secuencia de fecha de construcción en Scala  ( Construct date sequence in scala ) 
Quiero tener una secuencia de fecha continua como ['2014-01-01', '2014-01-02', ...] Entonces defino un arroyo para hacer eso. def daySeq(start: Date): St...

2  Función de archivo abierta en C ++  ( Openfile function in c ) 
Estoy en el proceso de aprendizaje de C ++ básico y una de las preguntas de práctica que encontré fue escribir una función para abrir un archivo en C ++. En...

3  Calculadora de impuestos utilizando Java 8 y Bigdecimal  ( Tax calculator using java 8 and bigdecimal ) 
Estoy aprendiendo Java8 y BigDecimal. El siguiente ejercicio involucrado Escribiendo una calculadora de impuestos que tomó un salario y calculó el impuesto. p...

3  Constructo: Rechizo Stream  ( Construct rebuffered stream ) 
Esto es parte de la construir biblioteca. Se utiliza rechazado para convertir una transmisión sin nombre / sin amigos, como desde un zócalo o una tubería en...

11  Transferencia de archivos sobre un arroyo  ( File transfer over a stream ) 
Estoy haciendo algo de programación en el lado y me gustaría saber si voy en la dirección correcta con mi código. module Main where import Text.ParserComb...

4  Monitoreo de trazas de satisfacción de las propiedades lógicas temporales  ( Monitoring traces for satisfaction of temporal logic properties ) 
Estoy tratando de implementar un monitor para una cierta lógica temporal. Lo que esto significa es lo siguiente: Hay alguna fuente externa, de la que viene...

2  Envoltura de flujo de respuesta HTTP que se encuentra  ( Seekable http response stream wrapper ) 
He creado este envoltorio para usar junto con zenity1 Streams y zenity2 . zenity3 LEA zenity4 índice Una vez desde el final del archivo, por lo que est...

9  Entrada de usuario y lectura de contenidos de archivo  ( User input and reading contents of file ) 
Para la divulgación completa: esta es una tarea para mi clase de programación y solo quiero consejos o consejos sobre algunos del código. Detalles de asigna...

9  Implementando una función de "división" rápida en una corriente de caracteres en Java  ( Implementing a fast split function on a stream of characters in java ) 
Estaba escribiendo un pedazo de código (un código personalizado $fragments5 para SOLR, pero eso no es demasiado relevante) diseñado para romper las líneas de...

6  C Getline () Implementación  ( C getline implementation ) 
Estoy practicando mi codificación C y quería implementar mi propia versión del getline Función en C para fines de aprendizaje. Me gustaría una revisión sobr...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos