2017-02-11 7 views
-1

どのような種類(オーディオ、ビデオ、イメージなど)の大きなファイルを小さなものにチャンクしたいと思います。私は多くのアルゴリズムを試しましたが、私はこれを行うことができません。誰でも私に動作するアルゴリズムを提案できますか?任意の種類のデータのチャンクアルゴリズム

+0

どういう意味ですか?あなたはコンテンツの種類を気にしないで、ファイルをいくつかの部分にカットしたいですか? – MBo

+0

ええ、私は小さな塊にカットしなければなりません –

+0

['split'](https://www.gnu.org/software/coreutils/manual/html_node/split-invocation.html)はどうですか? –

答えて

0

ちょうど次の開始位置を使用して小さなファイルにチャンクをコピーします。

N = FileSize/ChunkSize //integer division 
RestSize = FileSize % ChunkSize //integer modulo 
for i = 0 to N - 1 
    Copy ChunkSize bytes from position i * ChunkSize into ChunkFile[i] 
if RestSize > 0 
    Copy RestSize bytes from position N * ChunkSize into ChunkFile[N] 

例:2バイトのチャンクに7バイトのファイルを分割する必要があります。 N = 3、RestSize = 1. 3つの2バイトファイルと1つの1バイト。

0

私たちがそのようなメモリを持っていても、大量のファイルを一度に読み取ることはできません。基本的に各分割ごとに、パフォーマンスとメモリの両方で実現可能なフィックスサイズのバイト配列を読み込むことができます。

public static void main(String[] args) throws Exception 
     { 
      RandomAccessFile raf = new RandomAccessFile("test.csv", "r"); 
      long numSplits = 10; //from user input, extract it from args 
      long sourceSize = raf.length(); 
      long bytesPerSplit = sourceSize/numSplits ; 
      long remainingBytes = sourceSize % numSplits; 

      int maxReadBufferSize = 8 * 1024; //8KB 
      for(int destIx=1; destIx <= numSplits; destIx++) { 
       BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("split."+destIx)); 
       if(bytesPerSplit > maxReadBufferSize) { 
        long numReads = bytesPerSplit/maxReadBufferSize; 
        long numRemainingRead = bytesPerSplit % maxReadBufferSize; 
        for(int i=0; i<numReads; i++) { 
         readWrite(raf, bw, maxReadBufferSize); 
        } 
        if(numRemainingRead > 0) { 
         readWrite(raf, bw, numRemainingRead); 
        } 
       }else { 
        readWrite(raf, bw, bytesPerSplit); 
       } 
       bw.close(); 
      } 
      if(remainingBytes > 0) { 
       BufferedOutputStream bw = new BufferedOutputStream(new FileOutputStream("split."+(numSplits+1))); 
       readWrite(raf, bw, remainingBytes); 
       bw.close(); 
      } 
       raf.close(); 
     } 

     static void readWrite(RandomAccessFile raf, BufferedOutputStream bw, long numBytes) throws IOException { 
      byte[] buf = new byte[(int) numBytes]; 
      int val = raf.read(buf); 
      if(val != -1) { 
       bw.write(buf); 
      } 
     } 

またhttps://coderanch.com/t/458202/java/Approach-split-file-chunksのような様々なサイト上でいくつかの議論をして他のサイトになります。 ハッピーコーディング。

関連する問題