質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

17697閲覧

POIのSXSSF APIについて

syncrock

総合スコア209

Apache

Apacheは、Apache HTTP Serverの略で、最も人気の高いWebサーバソフトウェアの一つです。安定性が高いオープンソースソフトウェアとして商用サイトから自宅サーバまで、多くのプラットフォーム向けに開発・配布されています。サーバーソフトウェアの不具合(NCSA httpd)を修正するパッチ(a patch)を集積、一つ独立したソフトウェアとして開発されました。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2016/11/16 09:11

SXSSF APIではHSSFやXSSFなどのインメモリーではなく、BufferedStreamingなためメモリ低減が実現されているとのことです。
実際に使用してみましたが、HSSFでは緩やかですが右肩上がりにメモリが使用されていき、場合によってはOutOfMemoryが発生します。
SXSSFではメモリ使用上限に近づくと使用量がガクッと下がります。
その後また上限に近付くとガクッと下がり・・・の繰り返しです。

ここで質問なのですが、
SXSSFはBufferedStreamingなため、メモリ使用できるギリギリまで読み込み、危なそうになると中間ファイルにはかれ危機を脱している。というメモリの使用イメージであってますでしょうか?
また、中間ファイルが作成されるとのことですが、どこに出力されるのでしょうか。
winとlinuxで異なるのであればどちらも教えて頂けるとありがたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

SXSSFSheetの実装を見た限りでは、利用可能なメモリの上限とは特に関係なく、デフォルトではSXSSFWorkbook.DEFAULT_WINDOW_SIZEの値(=100)まで行数を保持し、一時ファイルに出力していない行数がこれを越えた場合に出力します。

投稿2016/11/17 09:02

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syncrock

2016/11/18 05:40

回答ありがとうございます。 理解力が無くて申し訳ないのですが、100行までは保持したまま処理を行い、101行目を保持しようとしたときに、上限の行数を超えるので一時ファイルに出力して、また100行まで保持して・・・という感じなのでしょうか? (デフォルト値のままの場合。)
guest

0

最近同じ問題出ているので、よく調べてわかりました。
SXSSFはヒープ領域(heap memory)の特性と同じように、出力専用のライブラリである。理解のキーは先頭のSである、StreamingのSである。InputStreamや、OutputStreamなど利用方法と一緒である。水流れように、戻り読込・書込できない。
それから、利用する時すべてデータやスタイルは最初に準備して、順番で行クリエートして、セルクリエートして、スタイルを設定して、値や計算式設定したら、数十メガバイトのエクセルファイルでも速く出力できた。

Apacheの公式サイトSXSSF (Streaming Usermodel API)に詳しい説明と例が有る。

投稿2019/02/13 06:19

ZhangDong

総合スコア12

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syncrock

2019/02/14 08:17

回答ありがとうございます。 過去にやりとりしていた内容含めて、公式サイトに詳細が載っていましたね。 メモリ低減の仕組みも理解できたように思えます。
guest

0

ベストアンサー

回答じゃないですけど、下記の記事をみるとSXSSFの概要について参考になりました。
Apache POIを使って、ちょっと大きなExcelを作る

SXSSFではメモリ使用上限に近づくと使用量がガクッと下がります。

実装をみてないので自分にはわからないですが、ライブラリーとして設計してあるはずのPOIが「メモリーの使用量ぎりぎりまで使う」ということをもししているなら「アプリケーションがどんなメモリーの使い方をするのかわからないのに勝手にメモリーを食い尽くす」ことになりかねず、私見ではそういう実装はしないのではと思いました。
アプリケーションの実行に従いヒープ使用量が増加->GCで不要メモリー回収というのはJavaアプリケーションの典型パターンですが、そうなっていただけでは?

中間ファイル

上の記事によれば/tmpだそうです。普通ですね。Windowsは分かりませんが、やはり普通の場所(C:\Users\xxx\AppData\Local\Tempとか?)ではないでしょうか?

投稿2016/11/16 11:18

編集2016/11/16 14:49
KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syncrock

2016/11/16 14:15

回答ありがとうございます。 >アプリケーションの実行に従いヒープ使用量が増加->GCで不要メモリー回収というのはJavaアプリケーションの典型パターンですが、そうなっていただけでは? HSSF等では増加しても使用中であるためにそのままOutOfMemoryになります。 ただ、SXSSFでは増加したとメモリー回収されたような形になり一旦落ち着いて、また増加して・・・となり、BufferedStreamingは読み込めるだけ読み込むっていうモノだと思ってるので、読み込むだけ読み込んで、限度がきそうなら中間にはいてからGCして・・・なのかと思いまして。 >普通の場所(C:\Users\xxx\AppData\Local\Tempとか?)ではないでしょうか? ありがとうございます、確認してみます。
KSwordOfHaste

2016/11/16 14:55

外部からの観察では推測しかできないので実際にどうなっているかが重要なら実装をみるのが一番確実ということになります。そうではなくメモリーの消費量の観察から考えられる実装の考察という意味合いなら本件とは別の質問にするか質問タイトルを変えた方がよいと思います。後者だとしても内容としては興味のある話(他の方の参考になり得る話)だと自分は思います。
syncrock

2016/11/17 00:35

実装としてはネットで調べれば出てくるようなロジックと大差ありません。 出力データをDBから取得してくるロジックとデータ編集が含まれる程度で基本的には inputStream = new FileInputStream("テンプレートファイルのパス"); XSSFWorkbook loadbook = new XSSFWorkbook(inputStream); SXSSFWorkbook workbook = new SXSSFWorkbook(loadbook); SXSSFSheet sheet = workbook.getSheetAt(0); Row row; Cell cell; ~DB取得ロジック~ for (DBより取得したデータループ) { row = sheet.createRow(行カウンタ); cell= row.createCell(セルカウンタ); ~データ編集処理~ cell.setCellStyle(セルのスタイル); cell.setCellValue(DBの値); } がSXSSFに関わるところで、特にロジックが変なことしてるようにあまり思えず。 ベストはSXSSFのメモリの使い方がわかればと思いましたが、 「BufferedStreamingのメモリの使い方が○○なので○○ではないか」という話でも聞けたらと思いました。 ちなみに、中間ファイルは見つかりました、ありがとうございます。 最初は0Kで作成され、SXSSFの処理中も0Kでしたが、あるタイミングで急にバイト数が数Mに増えましたのでGCされたタイミングなのかなと思っております。
KSwordOfHaste

2016/11/17 01:57

実装とは「SXSSF」の実装のことです。
syncrock

2016/11/17 02:23

すいません、勘違いしておりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問