[ 
https://issues.apache.org/jira/browse/CSV-295?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17506527#comment-17506527
 ] 

Zimo Li commented on CSV-295:
-----------------------------

 

Follow-up: 1.10.0-SNAPSHOT fixed the issue I'm having.
Scala sample code:
{code:java}
import org.apache.commons.csv.{CSVFormat, CSVPrinter}
import zio.clock.nanoTime
import zio.console.putStrLn
import zio.{Runtime, ZIO}

import java.io.{File, FileWriter}

val header = (0 to 1000).map(_.toString)
val file = new File(s"/Users/zli/Desktop/test.txt")
val fileWriter = new FileWriter(file)
val csvPrinter = new CSVPrinter(
  fileWriter,
  CSVFormat.RFC4180.builder().setHeader(header: _*).build()
)
Runtime.default.unsafeRun(for {
  t0 <- nanoTime
  _ <- ZIO
    .foreachParN_(8)(0 to 1000) { i =>
      val row = (0 to 1000).map(_ => i.toString)
      ZIO.effect({
        csvPrinter.printRecord(row: _*)
        csvPrinter.flush()
      })
    }
  t1 <- nanoTime
  _ <- putStrLn("Elapsed time: " + (t1 - t0)/1000000 + "ms")
} yield ())
fileWriter.flush()
fileWriter.close()
file.delete(){code}
Result of running 10 times:

with synchronized: 675ms

without synchronized: 750ms

This is not supposed to be a serious benchmark, but the results are quite 
surprising. JVM may be doing some optimization underneath.

 

> Support for parallelism in CSVPrinter
> -------------------------------------
>
>                 Key: CSV-295
>                 URL: https://issues.apache.org/jira/browse/CSV-295
>             Project: Commons CSV
>          Issue Type: Improvement
>          Components: Printer
>    Affects Versions: 1.9.0
>         Environment: 
> https://zio.dev/version-1.x/overview/overview_creating_effects#blocking-synchronous-side-effects
>            Reporter: Zimo Li
>            Priority: Major
>             Fix For: 1.10.0
>
>
> I am trying to write the result of network IO to a CSV file using Scala and 
> the ZIO library. The order of the rows does not matter, so I decided to use a 
> concurrency of 8.
> Each thread calls {{{}CSVPrinter.printRecord{}}}, and this caused some rows 
> to intersect with others. Eventually, I decided to use a 
> [Semaphore|https://zio.dev/version-1.x/datatypes/concurrency/semaphore] to 
> fix it.
> A locking mechanism for {{printRecord}} can be implemented just like the 
> underlying {{FileWriter}} or {{PrintWriter}}.



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to