Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.80) (envelope-from ) id 1aLDan-0002N6-Lw for pgsql-sql@arkaria.postgresql.org; Mon, 18 Jan 2016 17:27:50 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84) (envelope-from ) id 1aLDan-0006d7-4f for pgsql-sql@arkaria.postgresql.org; Mon, 18 Jan 2016 17:27:49 +0000 Received: from makus.postgresql.org ([2001:4800:1501:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84) (envelope-from ) id 1aLDZm-0005Xe-4v for pgsql-sql@postgresql.org; Mon, 18 Jan 2016 17:26:46 +0000 Received: from post.visena.com ([46.226.10.50]) by makus.postgresql.org with esmtps (TLS1.2:DHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.84) (envelope-from ) id 1aLDZe-0007hg-4B for pgsql-sql@postgresql.org; Mon, 18 Jan 2016 17:26:44 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=visena.com; s=20141101.wh; h=Content-Type:MIME-Version:Subject:In-Reply-To:Message-ID:To:From:Date; bh=yYfdlnQrnFKd1edsuUfmY8Wbt+balHwoXpXSBk7iWUo=; b=MEt8IFRbQGBnpcIa7siT3+M0cwacoDx/qlDP5yBmQ3WgyfE+WgAl5rNshU/TprHGneGWUw0Mk5YHgKERvxB5YCU14SgD6oHDXcQ5KSgOK5sVQqJlHQeT3H6HJLKYVgZ7RHTyRZufrH8D8IVYyh5XYe1QijNoBSZ7qrHEGNSgdpY=; Received: from [10.0.1.10] (helo=tc7-visena.wh.internal.visena.com) by post.visena.com with esmtp (Exim 4.82) (envelope-from ) id 1aLDZY-0006oP-E1 for pgsql-sql@postgresql.org; Mon, 18 Jan 2016 18:26:34 +0100 Received: from localhost ([127.0.0.1] helo=tc7-visena.wh.internal.visena.com) by tc7-visena.wh.internal.visena.com with esmtp (Exim 4.82) (envelope-from ) id 1aLDZY-0004WR-Cy for pgsql-sql@postgresql.org; Mon, 18 Jan 2016 18:26:32 +0100 Date: Mon, 18 Jan 2016 18:26:32 +0100 (CET) From: Andreas Joseph Krogh To: pgsql-sql@postgresql.org Message-ID: In-Reply-To: <614277427.7358116.1453134608680.JavaMail.yahoo@mail.yahoo.com> Subject: Re: BYTEA MIME-Version: 1.0 X-Mailer: Visena Mail 2.0.0-SNAPSHOT X-Spam-Score: 0.6 X-Spam-Report: SpamAssasin (score=0.6, required 5.0 ALL_TRUSTED=-1, HTML_MESSAGE=0.001, SUBJ_ALL_CAPS=1.625) X-Pg-Spam-Score: -0.5 (/) Content-Type: multipart/related; boundary="----=_Part_906_1038477243.1453137992331" List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-sql Precedence: bulk Sender: pgsql-sql-owner@postgresql.org ------=_Part_905_101929767.1453137992331 Content-Type: multipart/related; boundary="----=_Part_906_1038477243.1453137992331" ------=_Part_906_1038477243.1453137992331 Content-Type: multipart/alternative; boundary="----=_Part_907_571859276.1453137992348" ------=_Part_907_571859276.1453137992348 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable P=C3=A5 mandag 18. januar 2016 kl. 17:30:08, skrev Eugene Yin >: To understand it further, let me give an example that I have a group of=20 pictures (assume they a set of house pictures, such as living room, bedroom= ,=20 kitchen,patio, yard, etc).=C2=A0 I first save them (larger size) to the DB.= =C2=A0 Then=20 when the user retrieve them, the user first see a line-up ofsmall pics, the= n=20 they pick and click one, the selected one will popup a larger picture.=C2= =A0 =C2=A0 I have two ways to do this: =C2=A0 1) BYTEA =C2=A0 2) OID =C2=A0 For BYTEA, the whole set of pictures (larger size) are retrieved (dumped) i= nto=20 the memories on both the Java and Pg sides, occupying the same size as the= =20 original picture is.=C2=A0 Hence taking up larger memories. =C2=A0 For OID, it takes smaller memories on both Java and Pg sides (store the byt= e=20 array in a buffer?).=C2=A0 Whenever the user clicks the smaller pic, it the= n get the=20 byte array from the buffer and display the larger (original) sized one, hen= ce=20 taking up less memories (avoiding the memory leaking)? =C2=A0 One is always free to design an app in such a way that no matter how you st= ore=20 the images it may still use all available memory. My point is that using BL= OB=20 with OID (together with the pgjdbc-ng driver) lets you get away with using = as=20 little memory as you choose. It's the same as working with a large file usi= ng=20 FileInputStream. Consuming such streams is done by reading chunks of it int= o a=20 pre-allocated byte-array, which is the common way in most=20 programming-languages. This byte-array is the only extra penalty in you app= .=20 How you feed the contents of the stream back to the browser is up to you, a= nd=20 there are lots of ways to do that inefficiently, even if the underlying=20 producer of data is a stream of bytes. If you are in a JEE servlet-environm= ent=20 then writing to ServletOutputStream while reading form the BLOB's inputstre= am=20 is the most memory-efficient way to stream data from PG to the browser. =C2=A0 Note that reading BLOBs in PG requires a transaction. =C2=A0 -- Andreas Joseph Krogh CTO / Partner - Visena AS Mobile: +47 909 56 963 andreas@visena.com www.visena.com =C2=A0 ------=_Part_907_571859276.1453137992348 Content-Type: text/html;charset=UTF-8 Content-Transfer-Encoding: quoted-printable
P=C3=A5 mandag 18. januar 2016 kl. 17:30:08, skrev Eugene Yin <eugeneymail@ymail.com>:
To understand it further, let me give an exampl= e that I have a group of pictures (assume they a set of house pictures, suc= h as living room, bedroom, kitchen, patio, y= ard, etc).=C2=A0 I first save them (larger size) to the DB.=C2=A0 Then w= hen the user retrieve them, the user first see a line-up of small pics, then they pick and click one, the selected one will popup a larger picture.=C2=A0
=C2=A0
I have two ways to do this:
=C2=A0
1) BYTEA
=C2=A0
2) OID
=C2=A0
For BYTEA, the who= le set of pictures (larger size) are retrieved (dumped) into the memories o= n both the Java and Pg sides, occupying the same size as the original pictu= re is.=C2=A0 Hence taking up larger memories.
=C2=A0
For OID, it takes = smaller memories on both Java and Pg sides (store the byte array in a buffe= r?).=C2=A0 Whenever the user clicks the smaller pic, it then get the byte a= rray from the buffer and display the larger (original) sized one, hence tak= ing up less memories (avoiding the memory leaking)?
=C2=A0
One is always free to design an app in such a way that no matter how y= ou store the images it may still use all available memory. My point is that= using BLOB with OID (together with the pgjdbc-ng driver) lets you get away= with using as little memory as you choose. It's the same as working with a= large file using FileInputStream. Consuming such streams is done by readin= g chunks of it into a pre-allocated byte-array, which is the common way in = most programming-languages. This byte-array is the only extra penalty in yo= u app. How you feed the contents of the stream back to the browser is up to= you, and there are lots of ways to do that inefficiently, even if the unde= rlying producer of data is a stream of bytes. If you are in a JEE servlet-e= nvironment then writing to ServletOutputStream while reading form the BLOB'= s inputstream is the most memory-efficient way to stream data from PG to th= e browser.
=C2=A0
Note that reading BLOBs in PG requires a transaction.
=C2=A0
--
Andrea= s Joseph Krogh
CTO / Partner<= /span> - Visena AS
Mobile: +47 90= 9 56 963
=3D""
=C2=A0
------=_Part_907_571859276.1453137992348-- ------=_Part_906_1038477243.1453137992331 Content-Type: image/png Content-Transfer-Encoding: base64 Content-Disposition: inline Content-ID: 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 ------=_Part_906_1038477243.1453137992331-- ------=_Part_905_101929767.1453137992331--