サーバーで巨大なタスクをクライアントに分散し、それらを処理して結果を返す分散システムを開発しています。
サーバーは、サイズが 20Gb 程度の巨大なファイルを受け入れる必要があります。
サーバーはこのファイルを小さな断片に分割し、パスをクライアントに送信する必要があります。クライアントはファイルを scp して処理します。
私は and を使用read
しwrite
て、とてつもなく遅いファイル分割を実行しています。
コード
//fildes - Source File handle
//offset - The point from which the split to be made
//buffersize - How much to split
//This functions is called in a for loop
void chunkFile(int fildes, char* filePath, int client_id, unsigned long long* offset, int buffersize)
{
unsigned char* buffer = (unsigned char*) malloc( buffersize * sizeof(unsigned char) );
char* clientFileName = (char*)malloc( 1024 );
/* prepare client file name */
sprintf( clientFileName, "%s%d.txt",filePath, client_id);
ssize_t readcount = 0;
if( (readcount = pread64( fildes, buffer, buffersize, *offset ) ) < 0 )
{
/* error reading file */
printf("error reading file \n");
}
else
{
*offset = *offset + readcount;
//printf("Read %ud bytes\n And offset becomes %llu\n", readcount, *offset);
int clnfildes = open( clientFileName, O_CREAT | O_TRUNC | O_WRONLY , 0777);
if( clnfildes < 0 )
{
/* error opening client file */
}
else
{
if( write( clnfildes, buffer, readcount ) != readcount )
{
/* eror writing client file */
}
else
{
close( clnfildes );
}
}
}
free( buffer );
return;
}
- ファイルを分割するより速い方法はありますか?
- クライアントがscpを使用せずにファイル内のチャンクにアクセスできる方法はありますか(転送なしで読み取る)?
私はC++を使用しています。他の言語の方が高速に実行できる場合は、他の言語を使用する準備ができています。