2014-03-21 4 views
2

Мне нужно разделить большое изображение или текстовый файл на несколько кусков 10 байт. Эти куски будут отправляться через UDP на сервер. Проблема в следующем: 1. Не уверен в этом коде. Является ли это хорошим способом разделения файлов? 2. Использование памяти программ довольно велико. 400 КБ только для этой функции.Это правильный способ разделения большого файла?

int nChunks = 0; 
char chunk[10]; 
FILE *fileToRead; 
fileToRead = fopen(DEFAULT_FILENAME, "rb"); 

while (fgets(chunk, sizeof(chunk), fileToRead)) { 
    char *data = malloc(sizeof(chunk)); 
    strcpy(data, chunk); 

    packet *packet = malloc(sizeof(packet)); 
    packet->header = malloc(sizeof(packetHeader)); 
    packet->header->acked = 0; 
    packet->header->id = ++nChunks; 
    packet->header->last = 0; 
    packet->header->timestamp = 0; 
    packet->header->windowSize = 10; 
    packet->data = data; 

    list_append(packages, packet); 
} 


typedef struct packetHeader{ 
    ... 
}packetHeader; 

typedef struct packet{ 
    packetHeader *header; 
    void *data; 
}packet; 
+0

yup, выглядит хорошо для меня. переместите 'malloc' вне цикла while. чтение в байтах из потока 'FILE' в буфер, а затем повторное использование буфера. :) –

+0

400KB не о чем беспокоиться - даже телефоны имеют несколько ГБ. – suspectus

+0

это тесто для бесплатных 'header' и' data' после 'list_append –

ответ

3

Это хороший способ разделения файлов?

Когда файл состоит из десятисимвольных фрагментов текста, это нормально; поскольку в вашем случае файл является изображением, а не текстом, вы должны использовать fread вместо fgets.

Кроме того, вы должны пройти sizeof(chunk), а не sizeof(chunk)+1 в качестве размера. В противном случае fgets записывает дополнительный байт за конец пространства памяти, выделенного вашей программой.

И, наконец, вы не должны использовать strcpy для копирования общих данных: вместо этого используйте memcpy. На самом деле, вы можете избежать копирования в целом, если вам управлять буферами внутри цикла, как это:

#define CHUNK_SIZE 10 
... 
// The declaration of chunk is no longer necessary 
// char chunk[10]; 
... 
for (;;) { 
    char *data = malloc(CHUNK_SIZE); 
    size_t len = fread(data, CHUNK_SIZE, 1, fileToRead); 
    if (len == 0) { 
     free(data); 
     break; 
    } 
    // At this point, the ownership of the "data" can be transferred 
    // to packet->data without making an additional copy. 
    ... 
} 

Использование программ памяти довольно высок. 400 КБ только для этой функции.

Это потому, что чтение файла происходит намного быстрее, чем отправка его через UDP. Вот почему программе удается прочитать весь файл в памяти до того, как будут отправлены первые несколько пакетов UDP. Вам будет лучше читать и отправлять в том же цикле, чем в очередном порядке по всему списку пакетов. Когда вы читаете по мере отправки, более медленная часть процесса контролирует общий прогресс. Это позволит вашей программе использовать небольшую часть пространства памяти, которое оно использует сейчас, потому что буферизация не будет.

+0

Спасибо за ваше время. Хорошие моменты. –

+0

Функция fRead() работает быстрее и использует на 25 КБ меньше. Однако я получаю «\ 276» в конце некоторых кусков. Что это? Это число является инкрементным. –

+1

@WalterWhite 'fread' должен предоставить вам только то, что находится в файле, никакие паразитные данные не должны туда попасть. Это может быть проблема, связанная с использованием 'strcpy' - если есть нуль,' strcpy' останавливается раньше, оставляя «кучу мусора» из 'malloc' вместо фактических байтов из вашего изображения. – dasblinkenlight

Смежные вопросы