与えられた目的のための環境は現在利用できないので、私は物事を試すことができず、分析だけに頼らなければなりません!
私の目的は、次の明確なステップに分けることができます。
- ダムの「ファイルのアップロード」ページを使用して巨大なファイル(最大100GB)をアップロードする-ユーザーは(ダムの)フロントエンドを望んでおり、ファイルなどをFTPで転送することを望まないため、これから逃れることはできません。
- 上記のフロントエンドを提供するWebアプリケーションは、ローエンドマシン(2GBのRAMと40GBのHDD)でホストされます。このWebアプリケーションは、巨大なファイルのどの部分もローカルマシンに保存しませんが、「すばやく」書き込む必要があります。ハイエンドのリモートLinuxマシン
各ステップで、私のアプローチ、懸念事項、クエリを強調しています。
アップロードページでSpringMVCを使用してダムWebアプリケーションを作成することを計画していたので、このスレッドを参照しました-HTML5などに入る必要がありますか、それとも単純なWebアプリケーションで十分ですか?
2GBのRAMを考えると、Webアプリケーションは1GB未満のRAMを取得します。コードが厳密に記述されていない場合、「OutOfMemoryError」が発生する可能性があります。ストリームから、たとえば10MBを一度に読み取って、リモートLinuxマシンのファイルに書き込む必要があることを確認する必要があります。私がコントローラサーブレットのdoPost(...)にいると仮定して、続行する方法についていくつか読んだところ、混乱しました:
/** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse * response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub InputStream fis = request.getInputStream(); int i = 0; /* Approach - 1 : Plain old byte-by-byte method */ Socket socket = new Socket("192.168.90.20", 22); OutputStream remoteOpStream = socket.getOutputStream(); while ((i = fis.read()) != -1) { remoteOpStream.write(i); } /* clean-up */ /* Approach - 2 : NIO */ ByteBuffer byteBuff = ByteBuffer.allocate(10000);/* read 10MB of data */ ReadableByteChannel rdbyc = Channels.newChannel(request .getInputStream()); File remoteFile = new File("192.168.90.20/Remote_Linux_Folder");/* * Dunno * how * to * create * a * File * on a * remote * Linux * machine */ FileOutputStream remoteFos = new FileOutputStream(remoteFile); FileChannel writableChannel = remoteFos.getChannel(); while (true/* dunno how to loop till all the data is read! */) { rdbyc.read(byteBuff); writableChannel.write(byteBuff); } /* clean-up */ }
ローカルマシンのデータストレージを最小限に抑える方法が必要です。コードは入力ストリームからnバイトを読み取り、それをリモートマシンに書き込むだけです。
NIOが進むべき道だと思いますが、どのように進めなければならないかを明確にすることはできません。同じことについてガイドしてください。