Thread: Problem copying polygon data into a table
I have an text file in the format: 800|((180.87575,-45.98757),(180.87868, -45.98798),...,(Xn,Yn)) to be read into a table of: attr type id int region polygon using the command copy <table> from '<file>' using delimiters '|'; The polygon has about 800 vertices (& is relatively small as some of the polygons in my dataset go). Trying to copy this into the table generates the error msg: ERROR: Tuple is too big: size 12892 Does this mean that I've done summat incorrect, or that there is an undocumented limit in what can be loaded in a "copy" command, or a limit in the size (not area) of a polygon attribute? The message gives me the impression that there is a limit in the length of the string representing the polygon, so I could possibly fit more vertices by reducing the precision of each, but it still implies a limit which may render PostgreSQL unsuitable for my purposes. Any advice appreciated.... Thanks, Brent
> The polygon has about 800 vertices (& is relatively small as some of the > polygons in my dataset go). > > Trying to copy this into the table generates the error msg: > > ERROR: Tuple is too big: size 12892 It is a very old limitation, that one row (including the systems per row information and ALL attribute values) cannot exceed 8K - pageheader. 800 vertices is 1600 double precision floats is 12800 bytes. We actually discuss how to tackle that problem in a future release. And that far we know about a solution that could make your problem go away. What we don't have is a consensus on, and implementation of this solution. Jan -- #======================================================================# # It's easier to get forgiveness for being wrong than for being right. # # Let's break this rule - forgive me. # #========================================= wieck@debis.com (Jan Wieck) #
Brent Wood <brent.wood@blazemail.com> writes: > The polygon has about 800 vertices (& is relatively small as some of the > polygons in my dataset go). > Trying to copy this into the table generates the error msg: > ERROR: Tuple is too big: size 12892 > Does this mean that I've done summat incorrect, or that there is an > undocumented limit in what can be loaded in a "copy" command, or a limit > in the size (not area) of a polygon attribute? There is a limit, but it's hardly "undocumented" --- you're running into the infamous 8K-per-tuple limit. I believe polygons are stored with two float8's per vertex, so an 800-vertex polygon would take 16*800 bytes which matches your error message pretty nearly. You can only expect to fit maybe 500 vertexes in the standard 8K block size ... less if there's much other data in your tuples :-( This is a longstanding problem. There is discussion raging right now on the pghackers list about fixing it, and I think something may actually happen in the next release or two. In the meantime, the only reasonably simple recourse is to increase BLCKSZ (see src/include/config.h). But you can only bump it up as far as 32K, which'd be about 2K polygon vertexes; I don't know if that's enough for your purposes. regards, tom lane