在 JMP 資料表中壓縮(相同)影像JMP 能夠將影像儲存在資料列中。
即使儲存同一張圖片 1000 次,速度也超級快——而且不會佔用電腦記憶體。
但是將檔案儲存到硬碟上需要一些時間,而且會佔用大量空間!
啟用 GZ 壓縮也無濟於事:

試試看-為什麼 GZ 壓縮不起作用?
dt = new table("test", add rows(1000),Compress File When Saved( 1 ), new column ("img", Expression));
myIMg= New Image(open("https://apod.nasa.gov/apod/image/2603/NGC1300-LRGB_1024.jpg"));
:img[1] = myImg;
// add the image to row 1
dt << save("$temp\test1.jmp");
wait(0);
Show(File Size( "$temp\test1.jmp" ));
// add the image to every row
for each row(
:img=myImg
);
wait(0);
lastImg= new image(:img[1000]);
last image << scale(0.2);
ex = New Window( "Modal Dialog example",
Modal,
V List Box(
Text Box( "Wow, very fast! this is the image in row 1000:" ),
Picture Box (last image),
Text Box( "do you have enough time/space to save the data table?" ),
H list Box (Button Box ("OK",bb<< close window()),bb = Button Box("cancel", bb<< close window();stop();)),
)
);
dt << save("$temp\test2.jmp");
wait(0);
Show(File Size( "$temp\test2.jmp" ));
自動化和腳本編寫內容組織回覆:在 JMP 資料表中壓縮(相同)影像在檔案保存之前,為什麼 JMP 運行速度這麼快?
對用戶而言,似乎每一行都會保存一張圖片:

但 JMP 只儲存了對原始影像的引用。改變圖像大小即可顯示連結:
names default to here(1);
dt = new table("test", add rows(10),Compress File When Saved( 1 ), new column ("img", Expression));
myIMg= New Image(open("https://apod.nasa.gov/apod/image/2603/NGC1300-LRGB_1024.jpg"));
:img[1] = myImg;
// add the image to every row - as a "reference"
for each row(
:img=myImg
);
wait(0);
// add the image to row 4 - as a new image
:img[4] = new image(myImg);
// change on e of the images
image2 = :img[2];
image2 << scale(0.5);
// ... changes all the images - because all of them are links to the same image
Show(image2 << get size);
Show(myImg << get size);
Show(:img[3] << get size);
// all of them? not row 4
Show(:img[4] << get size);

回覆:在 JMP 資料表中壓縮(相同)影像當堆疊帶有圖像的表格時,也適用相同的技巧。
大膽去做吧——你可以堆疊成千上萬列,得到成千上萬張重複的圖片——它們是克隆的,不會佔用記憶體。
但千萬別去救那張疊起來的桌子!
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
dtstack = dt << Stack(
columns( :height, :weight )
);
:picture[1] << scale(5);
Show(:picture[1] << get size);
Show(:picture[2] << get size);
回覆:在 JMP 資料表中壓縮(相同)影像……並考慮附帶損害。
它們並不像你想的那樣顯而易見。
Names Default to Here(1);
dt = Open( "$SAMPLE_DATA/Big Class Families.jmp" );
Show(dt:picture[1] << get size);
dt sub = dt<< Subset( All rows, Selected columns only( 0 ) ); // non-linked subset
dt stack = dt << Stack(
columns( :height, :weight )
);
dt stack:picture[1] << scale(0.1);
Show(dt stack:picture[1] << get size);
Show(dt stack:picture[2] << get size);
Show(dt:picture[1] << get size);
Show(dt sub:picture[1] << get size);

回覆:在 JMP 資料表中壓縮(相同)影像JPG 格式本身就是一種優化過的壓縮格式。通常情況下,壓縮隨機數據、已壓縮數據或加密數據會導致數據量增大而不是減小,因為壓縮演算法幾乎找不到可壓縮的數據,而且還會在壓縮數據周圍添加頭部資訊和一些管理數據。沒錯,資料表確實將二進位影像以 base64 編碼的形式「保存」到列的字串欄位中,但對於 gzip 壓縮來說,它仍然看起來像是隨機資料。
我認為真正的問題(或許應該轉交給 JMP 技術支持,進而轉交給資料表開發者)是:為什麼這裡保存的不是單一副本和引用,而是完全相同的鏡像副本?我還假設,如果加載已保存的表,由於它們現在可能已經是不同的,因此會佔用大量記憶體。如果資料表知道它在記憶體中是相同的,為什麼在保存時不保持這一點?
回覆:在 JMP 資料表中壓縮(相同)影像[ 00296024 ]
->“
JMP 沒有以最大化影像儲存效率的方式壓縮資料表,這並不奇怪。看起來一切運作正常。
回覆:在 JMP 資料表中壓縮(相同)影像實際上,最簡單的辦法是:JMP 識別出圖像是相同的,並在儲存檔案時使用此資訊。
似乎在記憶體中,JMP 使用類似「指標」的東西,多個指標指向同一張圖片。 -> 產生表格時會進行收集。
JMP 儲存檔案時,會使用指針,對於相同的影像也毫不在意,會將它們逐一儲存。
然而,令我驚訝的是,該列的壓縮演算法沒有識別出重複項,也沒有有效地儲存它們。
我的AI推測(可能是出於向後相容性的考慮?),JMP使用了一種較舊的壓縮機制,其壓縮視窗較小(JMP的首選項中提到了gz格式)。在這種情況下,解析第二張影像時,第一張影像將位於壓縮視窗之外。
人工智慧建議:
改用更現代的壓縮方案(zstd / lzma?)不僅可以顯著提高多個相同影像的壓縮率,還可以更好地壓縮其他類型的列。
回覆:在 JMP 資料表中壓縮(相同)影像開發人員已經意識到這個問題,並表示他正在調查。 JMP 資料表最初並不支援影像,影像功能是最近(大約十年前)才新增的。我認為添加圖像支援時,採用這種方式是為了避免更改 .jmp 檔案格式,並保持向後相容性。對於舊版的 JMP,圖像會顯示為字串資料。此外,它還允許透過腳本建立包含圖像的表格。修復此問題可能需要更新 .jmp 檔案格式。或許可以將影像像分類資料或清單檢查類型的資料一樣儲存在內部,並且最好使用二進位 blob 格式而不是 base64 編碼。
非常感謝你們幫我們找出這些問題並進行修復。最終,我們希望 JMP 能夠兼顧高效能和良好的記憶體使用率。
資料量只會越來越大。
回覆:在 JMP 資料表中壓縮(相同)影像聽起來不錯。
感謝大家的坦誠討論與真知灼見

我們的共同目標是使 JMP 盡可能地完善——強大、全面、精良。
它應該會繼續保持世界最佳分析工具的地位。 ……隨著人工智慧的快速發展,競爭將會更加激烈!
回覆:在 JMP 資料表中壓縮(相同)影像Excel:關係容器(透過指針對影像進行去重)。
JMP:扁平資料流(每行重複影像二進位資料)。
— 由 Gemini 3.1 Pro 聲明