Hi everyone!

I tryed to construct one INSERT request.

The idea:

julia> pgavals #Array{Tuple{Int64,Int64,Float64,Float64,Float64,Float64},1}:

VALS = ""
for i in pgavals
         VALS = string(VALS, "$i,")
end

VALS = chop(VALS) # remove last ',' character

insquery = """
                INSERT INTO srss_api_production.pga_data 
                (report_id, version_id, lat, lon, pga_value, ep_dis) 
                values 
                $VALS;
                """
mysql_execute(con, insquery)



It works fine with small arrays and tuples.

*BUT *it impossible with ~500K elements in tuple due to very slow string 
concatenation operations. Please look at this example:

julia> pgavals
1617840-element Array{Tuple{Int64,Int64,Float64,Float64,Float64,Float64},1}:
 (10,2,54.495834,137.504166,0.0,515.0428287161928) 
 (10,2,54.495834,137.512497,0.0,514.6500363528039) 
 (10,2,54.495834,137.520828,0.0,514.2575525299238) 
...

VALS = ASCIIString("")
@time for i in pgavals
         VALS = VALS * "$i,"
end

#### it spens more than 1 hour and even not copleted!!!!


My platform:

MacBookPro11,1 / 2.8 GHz Intel Core i7

$ julia
               _
   _       _ _(_)_     |  A fresh approach to technical computing
  (_)     | (_) (_)    |  Documentation: http://docs.julialang.org
   _ _   _| |_  __ _   |  Type "?help" for help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 0.4.5 (2016-03-18 00:58 UTC)
 _/ |\__'_|_|_|\__'_|  |  
|__/                   |  x86_64-apple-darwin15.5.0


Is there any other way?

Andrey


On Monday, July 4, 2016 at 9:47:08 AM UTC+11, Jeffrey Sarnoff wrote:
>
> While I am not a user of MariaDB/MySQL, this may be of help.
>
> The most common way to speed bulk record insertion avoids your current 1 
> record per insertion loop by inserting multiple values [rows] with each 
> INSERT.  In SQL:
>
> INSERT INTO MyTable
>     (id, firstname, lastname)
> VALUES
>     (1, "Jane", "Smythe")   ,
>     (2, "John", "Jones")    ,
>     (3, "April", "Marlson") ;
>
>
>    Using a loop that increments in larger steps (n at once) and getting 
> the corresponding n records into a single INSERTion should improve things.
>    This sort of loop behaves in the following way (if you had 10 or 11 
> records in this example, the final few would be inserted individually at 
> the end).
>
> for i in 1:3:9
>     println( (i, i+1, i+2) )
> end
> (1,2,3)
> (4,5,6)
> (7,8,9)
>
>
> On Sunday, July 3, 2016 at 1:54:03 PM UTC-4, Andrey Stepnov wrote:
>>
>> Hi Community! 
>>
>> I just try to INSERT around 580K rows to MaraDB-table from array B: 
>>
>> julia> B 
>> 586973x4 Array{Float64,2}: 
>>  54.1958  142.929  0.15  333.636 
>> … 
>>
>>
>> using MySQL 
>> con = mysql_connect("127.0.0.1", "DB", "PASS", "srss_api_production") 
>>
>> # convert to tuple for big insert 
>> pgavals = 
>> Array{Tuple{Float64,Float64,Float64,Float64}}(0)                             
>>             
>>
>> for i in 1:length(B[:,1]) 
>>         pgavals = push!(pgavals, (B[i,1], B[i,2], B[i,3], B[i,4])) 
>> end 
>>
>> julia> pgavals 
>> 586973-element Array{Tuple{Float64,Float64,Float64,Float64},1}: 
>>  (54.195835,142.929169,0.15,333.63588213260454) 
>> ... 
>>
>>
>> # prepare 
>> mysql_stmt_prepare( 
>>                 con, 
>>                 """ 
>>                         INSERT INTO srss_api_production.pga_data 
>>                         (report_id, version_id, lat, lon, pga_value, 
>> ep_dis) 
>>                         values 
>>                         (10, 2, ?, ?, ?, ?); 
>>                 """ 
>>                 ) 
>> # insert 
>> for i in pgavals 
>>         mysql_execute( 
>>                         con, 
>>                         [MYSQL_TYPE_FLOAT, 
>>                          MYSQL_TYPE_FLOAT, 
>>                          MYSQL_TYPE_FLOAT, 
>>                          MYSQL_TYPE_FLOAT], 
>>                          i 
>>                          )   
>> end 
>>
>>
>> AND it extremely slow! I think because it generates 1 INSERT request for 
>> each row… 
>>
>> Please help me find out simple (or probably not) way to make INSERT 
>> faster. 
>>
>> Andrey 
>>
>>

Reply via email to